gpt4 book ai didi

bash - 傻瓜/awk : piping date to getline *sometimes* won't work

转载 作者:行者123 更新时间:2023-11-29 08:58:54 27 4
gpt4 key购买 nike

我正在尝试将日期从一种格式转换为另一种格式:来自例如“2005 年 10 月 29 日”至 2005-10-29。我有一个包含 625 个日期的列表。我使用 Awk。

大多数情况下,转换都有效。然而,有时转换根本不会发生,并且应该保存(转换后的)日期的变量仍然存在未定义。

这总是发生在完全相同的行上。在日期上显式地(从 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

如果你想重现这个问题:

  1. 下载此文件:uBXr0r15.txt .
  2. 运行 Awk 脚本。
  3. 在 bug-out-3.txt 中搜索“undefined”。
    (“undefined”在我的电脑上出现了 122 次。)

然后你可以再次运行脚本, 并且(在我的电脑上)bug-out-3.txt 仍然存在 未更改——完全相同的日期未定义。

(Gawk 版本 3.1.6,Ubuntu 9.10。)

亲切的问候,马格纳斯

最佳答案

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

在您的例子中,所有以 undefined 结尾的条目实际上都是重复的;第一次遇到它们时(即当相应的命令 date "..."-d "..." 首次发出时)正确的结果被读入 x。在同一日期的后续事件中,getline 尝试从原始 date 管道读取第二行、第三行等,即使该管道已被 关闭date,导致 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 之前,sortuniq uBXr0r15.txt 是否可以,或者您需要原始订单/副本吗?

关于bash - 傻瓜/awk : piping date to getline *sometimes* won't work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2391272/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com