bash – gawk / awk:getline的管道日期*有时*不起作用
我正在尝试将日期从一种格式转换为另一种格式:
从例如“2005年10月29日”至2005年10月29日. 我有625个日期列表.我用Awk. 转换有效 – 大部分时间. 这总是发生在完全相同的行上. 为什么会出现这种情况,以及如何修复脚本? 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. 然后你可以再次运行脚本, (Gawk 3.1.6版,Ubuntu 9.10.) 亲切的问候,马格努斯
无论何时打开用于读取或写入awk的管道或文件,后者都将首先检查(使用内部哈希)是否已经有一个管道或文件具有相同的名称(仍然)打开;如果是这样,它将重用现有的文件描述符,而不是重新打开管道或文件.
在您的情况下,所有最终未定义的条目实际上都是重复的;第一次遇到它们(即首次发出相应的命令日期“……” – d“……”)时,将正确的结果读入x.在同一日期的后续事件中,getline尝试从原始日期管道读取第二行,第三行等,即使管道已按日期关闭,导致x不再被分配. 从gawk手册页:
您应该在每次读取x后显式关闭管道: close("date "+%Y-%m-%d" -d " $1) 顺便说一下,在输入到awk之前排序和unq uBXr0r15.txt是否可以,或者你需要原始的排序/复制吗? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |