Awk &引用;“当前时间”;输出为零

Awk &引用;“当前时间”;输出为零,awk,Awk,我正试图从file1输入file2,这样file2中的每一行都是每一file1行的第一个字段,后跟一个空格和当前时间 例如 变成 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:3

我正试图从
file1
输入
file2
,这样
file2
中的每一行都是每一
file1
行的第一个字段,后跟一个空格和当前时间

例如

变成

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”

这样写时,同样的情况也会发生,
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

从您的问题中不清楚您期望的是哪种行为,但以下是两种Gnu awk解决方案:

  • 在整个命令运行期间,计算的日期-时间字符串必须保持不变:

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

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

  • 关于0的解释非常有用,非常好。TYVM。我可能应该为此发布一个新问题,但我如何设置代码,以便发送到CSV的是两个独立的字段,即一列表示$1,另一列表示时间?空格与FS一样好。如果相关,则只有文件2是CSV,文件1不是。不幸的是,这仍然会导致CSV文件将两个字段放在一个单元格中,只创建一列。我已经完成了这项工作,在这里:
    awk '{ print $1,strftime("%r") }' file1.csv > file2.csv