列内のタイムスタンプを日付に変換するにはどうすればよいですか?

列内のタイムスタンプを日付に変換するにはどうすればよいですか?

次の内容を含むファイルがあります:

1415602803,LOGIN SUCCESS,AUTH,user2,192.168.203.63,10.146.124.73,59996,22
1415602807,LOGIN SUCCESS,AUTH,user1,172.24.31.10,172.32.1.1,48191,22
1415602811,LOGIN FAILED,AUTH,root,172.24.166.153,10.146.124.73,52506,22
1415602815,LOGIN FAILED,AUTH,user3,192.168.123.55,10.146.32.99,55750,22

タイムスタンプを次の形式の日付に変換します。

2014-11-10 02:00:03,LOGIN SUCCESS,AUTH,user2,192.168.203.63,10.146.124.73,59996,22
2014-11-10 02:00:07,LOGIN SUCCESS,AUTH,user1,172.24.31.10,172.32.1.1,48191,22
2014-11-10 02:00:11,LOGIN FAILED,AUTH,root,172.24.166.153,10.146.124.73,52506,22
2014-11-10 02:00:15,LOGIN FAILED,AUTH,user3,192.168.123.55,10.146.32.99,55750,22

どうやってやるの?

これがうまくいくことはわかっています: perl -pe 's/(\d+)/localtime($1)/e'(この質問) ですが、出力形式は ですMon Nov 10 02:00:03 2014

このコマンドはタイムスタンプを目的の出力に変換できることはわかっていますが、引用符などが多いため、を使用しdate -d@1415602803 +"%F %H:%M:%S"ても機能しませんでした。awksystem("cmd")

答え1

ここで何かを見つけました:Stackoverflow - コマンドラインで unixtime から変換する

こう思いつきました:

awk -F"," '{OFS=","; $1=strftime("%Y-%m-%d %H:%M:%S", $1); print $0}' file
  • -F","フィールドセパレータとして,
  • OFS=",";出力フィールドも で区切られるので,
  • $1=strftime("%Y-%m-%d %H:%M:%S", $1);最初のフィールドの値を$1指定された形式に変更し、
  • print $0;行全体を印刷します。

答え2

こんな感じかな

perl -pe 'use POSIX qw(strftime); s/^(\d+)/strftime "%F %H:%M:%S", localtime($1)/e' 

答え3

必要に応じて、任意の日付形式でawk外部コマンドを使用できます。date

awk -F, -v OFS="," '{("date +%F\ %T -d @"$1)|getline $1}1'

答え4

9 か月前にこの質問と重複しているとマークされた質問をしました。この質問に対して、私にとって役に立った回答を投稿するようにというリクエストを今になって初めて見ました。ここにその質問と回答へのリンクがあります。

https://unix.stackexchange.com/a/304009/172916

関連情報