"20140919190454"→"2014年9月19日 19時4分54秒"が面倒くさい!
このような文字列変換をしたい場合、あなたならどうやるだろうか?
substrがたくさん出てきて面倒くさい!
echo 20140919190454 |
awk '
Y = substr($0, 1,4);
M = substr($0, 5,2);
D = substr($0, 7,2);
h = substr($0, 9,2);
m = substr($0,11,2);
s = substr($0,13,2);
printf("%d年%d月%d日 %d時%d分%d秒\n",Y,M,D,h,m,s);
'
と書けばできることはできるが、substr()何個も書くのは面倒くさいし、長ったらしい。なんとかならないか。
substr()を2個のsedに代えればいい
ちょっと頭を捻ってみよう。正規表現で2ケタずつの数字に分解した後、最初の4個は戻してやればいい。sedを2回カマせて、こんなふうに。
sedを2個使って分解する
$ echo 20140919190454 |
> sed 's/[0-9][0-9]/ &/g' | # ちなみに入力データが最初から最後まで数字とわかっているなら
> sed 's/ \([0-9][0-9]\) /\1/' # "[0-9]"を"."と書き換えてもっと簡単にしてもいい
2014 09 19 19 04 54
$
あとは、AWKコマンドに食わせる。AWKに食わせた時点で各単位の数字が$1
~$6
へ自動的に分かれて格納されているので、好きなフォーマットでprintfしておしまい。
まとめるとこうなる。
sedで各単位に分解、AWKで自由な書式に
$ echo 20140919190454 |
> sed 's/[0-9][0-9]/ &/g' |
> sed 's/ \([0-9][0-9]\) /\1/' |
> awk '{printf("%d年%d月%d日 %d時%d分%d秒\n",$1,$2,$3,$4,$5,$6);}'
2014年9月19日 19時4分54秒
$
AWK一発でもできる。
マルチプロセッサー(コア)環境で有利に働くので、上記のようにsed-sed-AWKと、3つのコマンドプロセスに分担させることを勧めるが、それがイヤならAWK一発でも一応できる。gsub()とsub()とsplit()を駆使し、もう少し頭を捻る。
sedで各単位に分解、AWKで自由な書式に
$ echo 20140919190454 |
> awk '
> # ↓2ケタ分解の際、今度は後ろにスペースを付ける
> gsub(/[0-9][0-9]/, "& ");
> sub(/ /, "");
> split($0, t);
> printf("%d年%d月%d日 %d時%d分%d秒\n",t[1],t[2],t[3],t[4],t[5],t[6]);
> }'
2014年9月19日 19時4分54秒
$
ちょっとはスマートになったでしょ?