AWK - 如何改进这个例子

时间:2012-11-16 12:37:32

标签: awk

我有一个文件:

2012-11-15 10:35:00 2012 11 15 10 22 00
2012-11-14 13:03:00 2012 11 14 13 03 00
2012-11-14 13:13:00 2012 11 14 13 13 00
2012-11-14 13:23:00 2012 11 14 13 23 00

此命令打印:

$ awk -F "\t" '{ system(" date -d \" "$1" \" +%s; date -d \" "$1" \" +%s ")}' file
1352972100
1352972100
1352894580
1352894580
1352895180
1352895180
1352895780
1352895780

我想在系统中打印():

1352972100 1352972100
1352894580 1352894580
1352895180 1352895180 
1352895780 1352895780

有办法吗?

2 个答案:

答案 0 :(得分:1)

使用GNU awk。目前还不清楚哪些字段真正得到了打印的时间戳,所以这里有一些使用输入文件的例子:

仅使用$ 1:

$ gawk '{s=mktime(gensub(/-/," ","g",$1" 0 0 0")); print s,s}' file
1352959200 1352959200
1352872800 1352872800
1352872800 1352872800
1352872800 1352872800

使用$ 1和$ 2:

$ gawk '{s=mktime(gensub(/[-:]/," ","g",$1" "$2)); print s,s}' file
1352997300 1352997300
1352919780 1352919780
1352920380 1352920380
1352920980 1352920980

使用$ 3开启:

$ gawk '{sub($1" "$2" ","");s=mktime($0); print s,s}' file
1352996520 1352996520
1352919780 1352919780
1352920380 1352920380
1352920980 1352920980

如果你没有gawk:

$ awk '{ ("date -d \" "$1" \" +%s") | getline s; print s,s}' file
1352959200 1352959200
1352872800 1352872800
1352872800 1352872800
1352872800 1352872800

编辑:更新了如何使用system()(不推荐):

获取此shell命令行:

$ printf "%s %s\n" $(date -d 2012/11/15 +%s) $(date -d 2012/11/15 +%s)
1352959200 1352959200

并从awk中的system()调用它:

$ awk '{system( "printf \"%s %s\n\" $(date -d " $1 " +%s) $(date -d " $1 " +%s)" )}' file
1352959200 1352959200
1352872800 1352872800
1352872800 1352872800
1352872800 1352872800

答案 1 :(得分:1)

awk -F "\t" '{ system(" echo $(date -d \" "$1" \" +%s; date -d \" "$1" \" +%s) ")}' file

这使用echo命令将两个输出展平为一行。这不是一个好的解决方案,但它确实符合使用系统和产生答案的标准。您也可以使用此变体:

awk -F "\t" '{ system(" x=$(date -d \" "$1" \" +%s); echo $x $x ")}' file