1

我有一个文件:

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

我想在 system() 中打印:

1352972100 1352972100
1352894580 1352894580
1352895180 1352895180 
1352895780 1352895780

有没有办法做到这一点?

4

2 回答 2

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

如果你没有傻瓜:

$ 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
于 2012-11-16T12:49:35.673 回答
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
于 2012-11-17T04:26:13.350 回答