【问题标题】:how to get the output of 'system' command in awk如何在 awk 中获取“系统”命令的输出
【发布时间】:2014-12-26 07:09:51
【问题描述】:

我有一个文件,一个字段是像20141028 20:49:49这样的时间戳,我想得到20的小时,所以我使用system命令:

hour=system("date -d\""$5"\" +'%H'")

时间戳是我文件中的第五个字段,所以我使用了$5。但是当我执行程序时,我发现上面的命令只是输出20并返回0所以hour is 0 but not 20,所以我的问题是如何获取时间戳中的小时?

我知道一个使用split函数两次的方法:

split($5, vec, " " )
split(vec[2], vec2, ":")

但是这种方法有点低效和丑陋。

还有其他解决方案吗?谢谢

【问题讨论】:

  • 具体来说,this answer.
  • @nu11p01n73R 我的错误,已更正谢谢
  • @TheParamagneticCroissant 我读了你给的帖子。根据我应该使用last_time_over_budget_in_hour="date -d" " +'%H'" $5 | getline的方法,但这是错误的。区别是the awk variable in the post is just after the shell command 但这里的awk变量在shell命令的中间`
  • @nu11p01n73R 没有,但我只是想知道这种方式的方法

标签: awk


【解决方案1】:

使用gawk的另一种方式:

gawk 'match($5, " ([0-9]+):", r){print r[1]}' input_file

如果你想知道如何管理awk中的外部进程输出:

awk '{cmd="date -d \""$5"\" +%H";cmd|getline hour;print hour;close(cmd)}' input_file

【讨论】:

  • +1:虽然“使用 getline”的答案可能应该更明确。
  • 谢谢,但是当我执行这个命令时出现错误`用法:日期[-jnu] [-d dst] [-r seconds] [-t west] [-v[+|- ]val[ymwdHMS]] ... [-f fmt 日期 | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+格式]`
  • 是的,你是对的,我换了一台机器,它得到了答案!但是你能解释一下cmd="date -d \""$5"\" +%H" ,反斜杠是干什么用的?谢谢
【解决方案2】:

您可以使用substr 函数来提取小时,而无需使用system 命令。

例如:

awk {'print substr("20:49:49",1,2)}'

将产生输出为

20

或者更具体的问题

 $ awk {'print substr("20141028 20:49:49",10,2)}'
 20

substr(str, pos, len)str 在位置pos 和长度len 处提取子字符串

如果$5的值为20141028 20:49:49

$ awk {'print substr($5,10,2)}'
20

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-25
    • 2023-04-05
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多