“当前时间”输出为零

时间:2018-10-17 12:00:33

标签: awk

我正在尝试从file2输入到file1,以便file2中的每一行是每一行file1的第一字段,后跟一个空格和当前时间。

例如

IN-X_4096_20140802_121306_007 `random text`
IN-X_4096_20140802_133431_012 `random text`
IN-A_6046_20130613_165426 `random text`
IN-A_6046_20130613_165426 `random text`
IN-X_4096_20140802_133431_014 `random text`

成为

IN-X_4096_20140802_121306_007 14:24:32
IN-X_4096_20140802_133431_012 14:24:32
IN-A_6046_20130613_165426 14:24:32
IN-A_6046_20130613_165426 14:24:32
IN-X_4096_20140802_133431_014 14:24:32

但是我得到的是

IN-X_4096_20140802_121306_007 0
IN-X_4096_20140802_133431_012 0
IN-A_6046_20130613_165426 0
IN-A_6046_20130613_165426 0
IN-X_4096_20140802_133431_014 0

我使用的代码是:

awk '{b=$1" "date +"%r"; print b >"file2.csv" }' file1.csv

当我使用“%T”时也会发生同样的事情

2 个答案:

答案 0 :(得分:3)

这样写,date被解释为变量名。由于未设置,因此它取决于上下文的值为""0+运算符之后的含义是它是在算术上下文中求值的,因此它取值为0

要将date +%r的值传递到awk脚本,请使用以下两种方法之一:

# the time when the script was run, doesn't change
awk -v time="$(date +%r)" '{ print time }' file1.csv

# the time when each record is read
awk '{ cmd = "date +%r"; cmd | getline time; print time; close(cmd) }' file1.csv

答案 1 :(得分:2)

根据您的问题尚不清楚您期望的是哪种行为,但这是两个Gnu awk解决方案:

  1. 在整个命令运行期间,计算出的日期时间字符串必须恒定:

    awk 'BEGIN{t=strftime("%r")}{ print $1,t }' file1.csv > file2.csv 
    
  2. 计算出的日期时间字符串必须每行更新一次:

    awk '{ print $1,strftime("%r") }' file1.csv > file2.csv