从例如“2005年10月29日”至2005年10月29日.
我有625个日期列表.我用Awk.
转换有效 – 大部分时间.
Hovewer,有时转换根本不会发生,
应该保持(转换)日期的变量仍然存在
未定义.
这总是发生在完全相同的行上.
在日期上显式地(从Bash shell)运行“date”
这些奇怪的行工作正常(日期被正确转换).
– 这些行的文本内容不重要.
为什么会出现这种情况,以及如何修复脚本?
她是:
awk 'BEGIN { FS = "unused" } { x = "undefined"; "date \"+%Y-%m-%d\" -d " $1 | getline x ; print $1 " = " x }' uBXr0r15.txt \ > bug-out-3.txt
如果要重现此问题:
>下载此文件:uBXr0r15.txt.
>运行Awk skript.
>在bug-out-3.txt中搜索“undefined”.
(“undefined”在我的电脑上发现了122次.)
然后你可以再次运行脚本,
和(在我的电脑上)bug-out-3.txt仍然存在
未更改 – 完全相同的日期未定义.
(Gawk 3.1.6版,Ubuntu 9.10.)
亲切的问候,马格努斯
在您的情况下,所有最终未定义的条目实际上都是重复的;第一次遇到它们(即首次发出相应的命令日期“……” – d“……”)时,将正确的结果读入x.在同一日期的后续事件中,getline尝试从原始日期管道读取第二行,第三行等,即使管道已按日期关闭,导致x不再被分配.
从gawk手册页:
NOTE: If using a pipe,co-process,or socket to getline,or
from print or printf within a loop,
you must use close() to create new
instances of the command or socket. AWK does not automatically
close pipes,sockets,or co-processes
when they return EOF.
您应该在每次读取x后显式关闭管道:
close("date \"+%Y-%m-%d\" -d " $1)
顺便说一下,在输入到awk之前排序和unq uBXr0r15.txt是否可以,或者你需要原始的排序/复制吗?