awkを使う

いま、MQTTでデータを送っていますが、データの最初のフィールドがエポックタイムになっています。なので、データをパッと見たところでは何時のデータなのか分かりません。 そこで、awkを使って普通の表示にしてやります。

まずは、最初のフィールドを切り出す必要があります。これは簡単で

awk -F, '{print $1}'

です。セパレータがコンマなので、-Fオプションで変更します。セパレータで区切られた最初のフィールドがプリントされます。

これだけだと

1418394962
1418395021
1418395081
1418395142
1418395202

なかんじなのでこれをdate コマンドで時刻表示に変換してあげます。 strftime()なる関数があるawk処理系もあるようですが、ここではシェルコマンドを使ってやってみました。

単純には

date -d @`cat data.txt|awk -F, '{print $1}'`

とやるとよさそうですが、複数行だとエラーします。

なので、各行ごとにdateコマンドが発行される必要があります。 ということはawk中で処理する必要があるということで。。。。

cat data.txt|awk -F, '{cmd="date -d @"$1; system(cmd)}'

これで、

2014年 12月 13日 土曜日 00:02:01 JST
2014年 12月 13日 土曜日 00:03:02 JST
2014年 12月 13日 土曜日 00:04:01 JST
2014年 12月 13日 土曜日 00:05:01 JST

こんな感じになります。ひとまずok。

で、さらに、この日付の後、データを表示しようとおもって、

cat data.txt|awk -F, '{cmd="date -d @"$1; system(cmd); print $2"  "$3}'

とすると。。。。

2014年 12月 13日 土曜日 00:05:01 JST
 1710   2004
2014年 12月 13日 土曜日 00:06:02 JST
 1709   2002
2014年 12月 13日 土曜日 00:07:01 JST
 1710   2003

コマンド実行結果に改行コードが入っているので、こんなになってしまいます。 これではいけないということで、色々調べてみると

cat data.txt|awk -F, '{cmd="date -d @"$1; cmd | getline result; close(cmd); print result "  " $2"  "$3}'

としてやるといいことが分かりました。変数にコマンドを書いて、それを実行して結果を得るために cmd | getline 変数(結果が入る) というのが想像できませんでした。

2014年 12月 13日 土曜日 00:09:01 JST   1710   2003
2014年 12月 13日 土曜日 00:10:02 JST   1710   2002
2014年 12月 13日 土曜日 00:11:02 JST   1709   2003

これで、望むフォーマットになりました。

日付と時間だけをプリントするのはdateコマンドにフォーマット指示を追加して

cmd= "date +\"%F %T\" -d @"

フォーマット内部にスペースを指定するためにはダブルクオートでフォーマットをくくる必要があります。awkにはバックスラッシュでダブルクオートをエスケープしておきます。