bash – gawk / awk:getline的管道日期*有时*不起作用

前端之家收集整理的这篇文章主要介绍了bash – gawk / awk:getline的管道日期*有时*不起作用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试将日期从一种格式转换为另一种格式:
从例如“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.)

亲切的问候,马格努斯

无论何时打开用于读取或写入awk的管道或文件,后者都将首先检查(使用内部哈希)是否已经有一个管道或文件具有相同的名称(仍然)打开;如果是这样,它将重用现有的文件描述符,而不是重新打开管道或文件.

在您的情况下,所有最终未定义的条目实际上都是重复的;第一次遇到它们(即首次发出相应的命令日期“……” – 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是否可以,或者你需要原始的排序/复制吗?

猜你在找的Bash相关文章