首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >gawk / awk:管道日期到getline *有时*不起作用

gawk / awk:管道日期到getline *有时*不起作用
EN

Stack Overflow用户
提问于 2010-03-06 03:46:57
回答 3查看 4.5K关注 0票数 7

我试图将日期从一种格式转换为另一种格式。“2005年10月29日”至2005年-10- 29我有625个约会的清单。我用Awk。

转换是有效的--大部分时间。Hovewer,有时转换根本不会发生,并且应该保存(转换)日期的变量仍未定义。

这种情况总是发生在完全相同的行中。在这些奇怪的行的日期上显式地运行‘`date’(从Bash )可以很好地工作(日期是正确转换的)。-重要的不是这些行的文本内容。

为什么是这种行为,以及如何修复我的脚本?

她是这样的:

代码语言:javascript
复制
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中搜索“未定义”。 (在我的电脑上发现了122次“未定义”。)

然后您可以再次运行脚本,并且(在我的计算机上)bug-out(3.txt)保持不变--完全相同的日期仍未定义。

(Gawk版本3.1.6,Ubuntu 9.10.)

你好,马格努斯

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-06 04:07:51

每当您打开管道或文件以便在awk中读取或写入时,后者将首先检查(使用内部哈希)是否已经打开了同名为(静止)的管道或文件;如果是,则将重用现有的文件描述符,而不是重新打开管道或文件。

在您的示例中,所有以undefined结尾的条目实际上都是重复的;当第一次遇到这些条目时(即,当首次发出相应的命令date "..." -d "..."时),正确的结果将被读入x。在随后的同一天发生的事件中,getline尝试从原始date管道读取第二行、第三行等等,即使管道已被date关闭,导致x不再被分配。

来自gawk手册页:

注意:如果使用管道、协处理或套接字来获取行,或者使用循环中的print或printf,则必须使用close()来创建命令或套接字的新实例。AWK在返回EOF时不会自动关闭管道、套接字或共同进程。

每次读完close之后,都应该显式地使用x

代码语言:javascript
复制
close("date \"+%Y-%m-%d\" -d " $1)

顺便说一句,sortuniq uBXr0r15.txt在进入awk之前是否还可以,还是您需要原始的订单/复制?

票数 11
EN

Stack Overflow用户

发布于 2010-03-06 04:02:23

虽然我喜欢awk,但这是不必要的。

tr -d '"' < uBXr0r15.txt | date +%Y-%m-%d -f -

票数 3
EN

Stack Overflow用户

发布于 2010-03-06 04:25:37

代码语言:javascript
复制
 gawk 'BEGIN{
       m=split("January|February|March|April|May|June|July|August|September|October|November|December",d,"|")
       for(o=1;o<=m;o++){
          months[d[o]]=sprintf("%02d",o)
       }
       FS="[, ]"
    }
    {
      gsub(/["]/,"",$1)
      gsub(/["]/,"",$4)
      t=mktime($4" "months[$1]" "$2" 0 0 0")
      print strftime("%Y-%m-%d",t)
    }' uBXr0r15.txt

在gawk中做任何事情都比调用外部命令要快。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2391272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档