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

GNUawkを使用します。印刷用のタイムスタンプを実際に取得しているフィールドが明確ではないため、入力ファイルを使用したいくつかの例を次に示します。

たったの$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()を使用する方法を更新しました(推奨されません):

次のシェルコマンドラインを使用します。

$ 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コマンドを使用して2つの出力を1行にフラット化します。これは良い解決策ではありませんが、システムを使用して答えを出すという基準を満たしています。このバリアントも使用できます。

awk -F "\t" '{ system(" x=$(date -d \" "$1" \" +%s); echo $x $x ")}' file
于 2012-11-17T04:26:13.350 に答える