在unix文件中的一个整列上应用一组操作

时间:2016-11-15 11:39:48

标签: bash shell unix awk

我的文件看起来像:

    "JOB1 #43",  43 "SUCCESS",  1479079800029
    "JOB1 #42",  42 "SUCCESS",  1478993400042
    "JOB1 #41",  41 "SUCCESS",  1478907000065
    "JOB1 #40",  40 "SUCCESS",  1478820600085
    "JOB1 #39",  39 "SUCCESS",  1478734200051

需要使用日期和时间格式更改最后一列(时间戳)。

到目前为止尝试过:

 for i in `cat file | awk '{print $NF}'`
 do
      date -d @$(  echo "(${i} + 500) / 1000" | bc)
 done

输出:

    Sun Nov 13 23:30:00 GMT 2016
    Sat Nov 12 23:30:00 GMT 2016
    Fri Nov 11 23:30:00 GMT 2016
    Thu Nov 10 23:30:00 GMT 2016
    Wed Nov  9 23:30:00 GMT 2016

预期输出

"JOB1 #43",  43 "SUCCESS",  Sun Nov 13 23:30:00 GMT 2016
"JOB1 #42",  42 "SUCCESS",  Sat Nov 12 23:30:00 GMT 2016
"JOB1 #41",  41 "SUCCESS",  Fri Nov 11 23:30:00 GMT 2016
"JOB1 #40",  40 "SUCCESS",  Thu Nov 10 23:30:00 GMT 2016
"JOB1 #39",  39 "SUCCESS",  Wed Nov  9 23:30:00 GMT 2016

我们可以在文件中更改它吗?

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:2)

尝试:

awk -F',\\s*' '{print $1 "," $2 "," strftime("%c", $3/1000)}' file

输出:

"JOB1 #43",43 "SUCCESS",Sun 13 Nov 2016 23:30:00 GMT
"JOB1 #42",42 "SUCCESS",Sat 12 Nov 2016 23:30:00 GMT
"JOB1 #41",41 "SUCCESS",Fri 11 Nov 2016 23:30:00 GMT
"JOB1 #40",40 "SUCCESS",Thu 10 Nov 2016 23:30:00 GMT
"JOB1 #39",39 "SUCCESS",Wed 09 Nov 2016 23:30:00 GMT

您可能希望根据需要调整日期格式。

答案 1 :(得分:1)

您可以使用此awk命令(也可以使用非gnu awk):

awk -F , '{cmd="TZ=UTC date -d @" sprintf("%d", ($NF+500)/1000); 
           cmd | getline dt; gsub(/[0-9]+$/, dt); close(cmd)} 1' file

"JOB1 #43",  43 "SUCCESS",  Sun Nov 13 23:30:00 UTC 2016
"JOB1 #42",  42 "SUCCESS",  Sat Nov 12 23:30:00 UTC 2016
"JOB1 #41",  41 "SUCCESS",  Fri Nov 11 23:30:00 UTC 2016
"JOB1 #40",  40 "SUCCESS",  Thu Nov 10 23:30:00 UTC 2016
"JOB1 #39",  39 "SUCCESS",  Wed Nov  9 23:30:00 UTC 2016
  • 我们使用getline函数调用您想要的date命令,并将输出存储在变量dt
  • 最后我们使用gsub代替分配,即$NF = dt来维护输出中输入记录的格式

答案 2 :(得分:0)

由于您已经有了要替换的内容,因此可以使用python脚本轻松完成合并。

f1=open("a.txt")
f2=open("b.txt")

lines1 = f1.readlines()
lines2 = f2.readlines()
output_lines=[]
for (l1,l2) in zip(lines1,lines2):
   fields = l1.split(",")
   fields[2] = l2
   output_line = ",".join(fields)
   output_lines.append(output_line)
f3 = open("result.txt","w")
f3.writelines(output_lines)
f3.close()

输出:result.txt

"JOB1 #43",  43 "SUCCESS",Sun Nov 13 23:30:00 GMT 2016
"JOB1 #42",  42 "SUCCESS",Sat Nov 12 23:30:00 GMT 2016
"JOB1 #41",  41 "SUCCESS",Fri Nov 11 23:30:00 GMT 2016
"JOB1 #40",  40 "SUCCESS",Thu Nov 10 23:30:00 GMT 2016
"JOB1 #39",  39 "SUCCESS",Wed Nov  9 23:30:00 GMT 2016