LoginSignup
11
11

More than 5 years have passed since last update.

"YYYYMMDDHHMMSS"を各単位に分解する簡単な方法

Last updated at Posted at 2014-09-19

"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秒
$ 

ちょっとはスマートになったでしょ?

11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11