web-dev-qa-db-ja.com

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

これを含むファイルがあります:

_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'(from this question )ですが、出力形式は_Mon Nov 10 02:00:03 2014_です。

このコマンドでタイムスタンプを目的の出力に変換できることはわかっています:_date -d@1415602803 +"%F %H:%M:%S"_ですが、すべての引用符とその他の理由により、system("cmd")を使用してawkで動作させることができませんでした。

15
Alaa Ali

このように

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

ここに何かが見つかりました: 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;_行全体を印刷します。
17
Alaa Ali

awkが好きな場合は、外部コマンドdateを任意の日付形式で使用できます

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

9か月前に、これと重複している質問をしました。たった今、この質問に対して私のために働いた答えを投稿する要求を見ました。ここにその質問と回答へのリンクがあります。

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

2
Emily Shaffer

あなたも試すことができます:

cat test.txt | sed 's/^/echo "/; s/\([0-9]\{10\}\)/`date -d @\1`/; s/$/"/' | bash
2
kayn