csvファイルの2番目の列をUnix時刻から読み取れる日付/時刻に変換するBashスクリプト

csvファイルの2番目の列をUnix時刻から読み取れる日付/時刻に変換するBashスクリプト

私の入力ファイルはカンマで区切られた.csvです。 2番目の列をUnix時間から次のように読みやすい日付/時刻形式に変換したいと思います。

before   1502280000
after    8/10/17 08:00:00

またタイトルなので、最初の行を無視したいです。

私はSolaris 10のbashシェルで実行しています。

私のCSVの最初の2行は次のとおりです。

HOST,DATE_TIME_CREATED,USER_ID,EVENT_CLASS
xxxx,1502286180,xxxx,xxxx
xxxx,1502280347,xxxx,xxxx

出力を探す

HOST,DATE_TIME_CREATED,USER_ID,EVENT_CLASS
xxxx,Wed Aug  9 09:43:00 EDT 2017,xxxx,xxxx
xxxx,Wed Aug  9 08:05:47 EDT 2017,xxxx,xxxx

答え1

私はYYYY-mm-dd HH:MM:SS時間形式を強くお勧めします。この形式は明確で、語彙と時系列でソートされています。

これを達成するためにPerlを使用することができます。

perl -MPOSIX=strftime -F, -ane '
    $F[1] = strftime("%F %T", localtime $F[1]) if $. > 1; 
    print join ",", @F
' file

答え2

このawk方法:

awk -F, 'NR>1{printf"%s,",$1;
             system("printf \"$(date -d @"$2")\"");printf",%s,%s\n",$3,$4}
' infile.txt
HOST,DATE_TIME_CREATED,USER_ID,EVENT_CLASS
xxxx,Wed Aug  9 09:43:00 EDT 2017,xxxx,xxxx
xxxx,Wed Aug  9 08:05:47 EDT 2017,xxxx,xxxx

答え3

Miller(mlr)を使用してUnixタイムスタンプ形式を指定しますstrftime_local()。生成された時間+日付はローカルタイムゾーンです。

$ mlr --csv put '$DATE_TIME_CREATED = strftime_local($DATE_TIME_CREATED,"%c")' file
HOST,DATE_TIME_CREATED,USER_ID,EVENT_CLASS
xxxx,Wed Aug  9 13:43:00 2017,xxxx,xxxx
xxxx,Wed Aug  9 12:05:47 2017,xxxx,xxxx

strftime(3)利用可能なフォーマット文字列については、システムのマニュアルを参照してください。%c「国別の時間と日付表現に置き換える」形式です。

関連情報