加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 01:27:16 所属栏目:安全 来源:网络整理
导读:我正在尝试将日期从一种格式转换为另一种格式: 从例如“2005年10月29日”至2005年10月29日. 我有625个日期列表.我用Awk. 转换有效 – 大部分时间. Hovewer,有时转换根本不会发生, 应该保持(转换)日期的变量仍然存在 未定义. 这总是发生在完全相同的行上. 在
我正在尝试将日期从一种格式转换为另一种格式:
从例如“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是否可以,或者你需要原始的排序/复制吗?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读