我试图将日期从一种格式转换为另一种格式。“2005年10月29日”至2005年-10- 29我有625个约会的清单。我用Awk。
转换是有效的--大部分时间。Hovewer,有时转换根本不会发生,并且应该保存(转换)日期的变量仍未定义。
这种情况总是发生在完全相同的行中。在这些奇怪的行的日期上显式地运行‘`date’(从Bash )可以很好地工作(日期是正确转换的)。-重要的不是这些行的文本内容。
为什么是这种行为,以及如何修复我的脚本?
她是这样的:
awk 'BEGIN { FS = "unused" } {
x = "undefined";
"date \"+%Y-%m-%d\" -d " $1 | getline x ;
print $1 " = " x
}' uBXr0r15.txt \
> bug-out-3.txt如果您想重现这个问题:
然后您可以再次运行脚本,并且(在我的计算机上)bug-out(3.txt)保持不变--完全相同的日期仍未定义。
(Gawk版本3.1.6,Ubuntu 9.10.)
你好,马格努斯
发布于 2010-03-06 04:07:51
每当您打开管道或文件以便在awk中读取或写入时,后者将首先检查(使用内部哈希)是否已经打开了同名为(静止)的管道或文件;如果是,则将重用现有的文件描述符,而不是重新打开管道或文件。
在您的示例中,所有以undefined结尾的条目实际上都是重复的;当第一次遇到这些条目时(即,当首次发出相应的命令date "..." -d "..."时),正确的结果将被读入x。在随后的同一天发生的事件中,getline尝试从原始date管道读取第二行、第三行等等,即使管道已被date关闭,导致x不再被分配。
来自gawk手册页:
注意:如果使用管道、协处理或套接字来获取行,或者使用循环中的print或printf,则必须使用close()来创建命令或套接字的新实例。AWK在返回EOF时不会自动关闭管道、套接字或共同进程。
每次读完close之后,都应该显式地使用x。
close("date \"+%Y-%m-%d\" -d " $1)顺便说一句,sort和uniq uBXr0r15.txt在进入awk之前是否还可以,还是您需要原始的订单/复制?
发布于 2010-03-06 04:02:23
虽然我喜欢awk,但这是不必要的。
tr -d '"' < uBXr0r15.txt | date +%Y-%m-%d -f -
发布于 2010-03-06 04:25:37
gawk 'BEGIN{
m=split("January|February|March|April|May|June|July|August|September|October|November|December",d,"|")
for(o=1;o<=m;o++){
months[d[o]]=sprintf("%02d",o)
}
FS="[, ]"
}
{
gsub(/["]/,"",$1)
gsub(/["]/,"",$4)
t=mktime($4" "months[$1]" "$2" 0 0 0")
print strftime("%Y-%m-%d",t)
}' uBXr0r15.txt在gawk中做任何事情都比调用外部命令要快。
https://stackoverflow.com/questions/2391272
复制相似问题