Bash 将文件中的时间戳转换为纪元
我有一个选项卡分隔的文件,在第三个字段中有时间戳,我需要在bash中将其更改为历元 样本输入:Bash 将文件中的时间戳转换为纪元,bash,vim,awk,sed,gawk,Bash,Vim,Awk,Sed,Gawk,我有一个选项卡分隔的文件,在第三个字段中有时间戳,我需要在bash中将其更改为历元 样本输入: xyz@gmail.com SALE 2017-04-26 12:47:27 30.0 1 201704 xyz@gmail.com SALE 2017-04-26 12:46:15 20.0 2 201704 xyz@gmail.com PAYBACK 2017-04-18 08:02:31 95.0 3
xyz@gmail.com SALE 2017-04-26 12:47:27 30.0 1 201704
xyz@gmail.com SALE 2017-04-26 12:46:15 20.0 2 201704
xyz@gmail.com PAYBACK 2017-04-18 08:02:31 95.0 3 201704
xyz@gmail.com SEND 2017-04-18 08:00:37 4800.0 4 201704
xyz@gmail.com SEND 2017-04-17 14:59:34 4900.0 5 201704
我尝试了awk'BEGIN{IFS=“\t”}{$3=system(“date-d\”“$3”\'+%s”);print}文件
,该文件给出了最接近的结果,但它在一行中显示历元,然后在时间戳值为零的换行中再次显示记录。我需要一条记录中的所有内容,并替换第三个字段。使用GNU awk:
$ cat tst.awk
BEGIN { FS=OFS="\t" }
{
$3 = mktime(gensub(/[-:]/," ","g",$3))
print
}
$ awk -f tst.awk file
xyz@gmail.com SALE 1493228847 30.0 1 201704
xyz@gmail.com SALE 1493228775 20.0 2 201704
xyz@gmail.com PAYBACK 1492520551 95.0 3 201704
xyz@gmail.com SEND 1492520437 4800.0 4 201704
xyz@gmail.com SEND 1492459174 4900.0 5 201704
对于其他AWK:
$ cat tst.awk
BEGIN { FS=OFS="\t" }
{
cmd = "date -d \"" $3 "\" \047+%s\047"
if ( (cmd | getline line) > 0 ) {
$3 = line
}
close(cmd)
print
}
$ awk -f tst.awk file
xyz@gmail.com SALE 1493228847 30.0 1 201704
xyz@gmail.com SALE 1493228775 20.0 2 201704
xyz@gmail.com PAYBACK 1492520551 95.0 3 201704
xyz@gmail.com SEND 1492520437 4800.0 4 201704
xyz@gmail.com SEND 1492459174 4900.0 5 201704
编写脚本-没有名为IFS
的内置awk变量,系统
返回上一次命令运行的退出状态,而不是stdout,并且不能在从shell调用的任何
分隔脚本中包含'
s
要想“就地”进行编辑,没有UNIX编辑器真正就地进行编辑,但在GNU awk中,您可以使用-i inplace
来避免自己指定tmp文件名。但是,使用任何UNIX命令,您都可以执行cmd file>tmp&&mv tmp file
请注意,这是
getline
为数不多的适当用途之一-有关其他有效用途,请参阅,最重要的是,除非绝对必要,否则不要使用它的注意事项和理由。感谢您的帮助。。。这个解决方案有效。我理解就地部分以及为什么不能在这里完成,但是你能解释一下或者给我一些链接我的脚本出了什么问题吗?我不知何故无法编辑m评论来删除“此处”,但我的意思是我理解为什么不能完成。只是希望通过一些链接来理解我的脚本中的问题,以及更详细的解决方法。尽管如此,谢谢你的帮助,我很乐意去。:-)不客气,我建议您购买Arnold Robbins的《有效的Awk编程》第四版。它将解释您开始使用awk和更多所需了解的一切。