【问题标题】:Why does awk return an extra line and "0" after system call?为什么awk在系统调用后返回一个额外的行和“0”?
【发布时间】:2015-03-02 07:45:20
【问题描述】:

此 awk 脚本使用系统调用将秒转换为时间码。为什么不使用内置函数呢?出于便携性原因。这需要在 OS X Mavericks(GNU bash,版本 3.2.53,awk 版本 20070501)上工作,内置 strftime 函数不可用(据我所知)。

cat file
A 3000
B 3010
C 3020

我的脚本:

awk '{ printf "%s %s\n", system( "date -r " $2 " -j +%H:%M:%S" ), $1 }' file

返回这个

01:50:00
0 A
01:50:10
0 B
01:50:20
0 C

当我尝试在与时间码相同的行上打印第一条记录的值时,如下所示:

01:50:00 A
01:50:10 B
01:50:20 C

我做错了什么?

【问题讨论】:

  • 如果 awk 的所有版本都没有您需要的功能,也许您应该改用 Perl 或 Python(或类似的东西)。

标签: macos bash shell awk


【解决方案1】:

您可以像这样使用date 命令打印$1 的文字值:

awk '{ system( "/bin/date -r " $2 " -j \"+%H:%M:%S " $1 "\"" ) }' file
19:50:00 A
19:50:10 B
19:50:20 C

或者在 awk 中使用getline

awk '{ cmd = "/bin/date -r " $2 " -j +%H:%M:%S"; 
        if (cmd | getline var) printf "%s %s\n", d, $1; close (cmd) }' file
19:50:00 A
19:50:10 B
19:50:20 C

【讨论】:

  • @user2243670 Getline 是最佳选择。虽然仍然不需要 printf 只需使用print d,$1
  • 学到了很多,谢谢!不应该像示例中那样关闭命令吗?类似close("date")?
  • 你需要关闭你运行的exact字符串。
  • 它必须是if (cmd | getline d)...,否则如果输入文件包含无效日期,您将重复打印最后一个有效日期。见awk.info/?tip/getline
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2017-02-10
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
相关资源
最近更新 更多