LoginSignup
4
6

More than 5 years have passed since last update.

CSV ファイルの特定の列を取り出すのにsed とかcut とか使わない

Posted at

結論

Perl のワンライナーを使おう。

最近、知人がこちらの記事をストックしていたので条件反射的に書きます。
CSV ファイルの特定の列を取り出す

やってみる

$ cat member.csv

id,name,age
1,taro,21
2,jiro,18
3,saburo,16
4,shiro,15
5,goro,12

こんなファイルがあって、IDの列だけ取り出して書きのような結果を得たいというお題です。

1
2
3
4
5

先程の記事では結論だけ書くと、cut とsed を組み合わせて

cut -d ',' -f 1 member.csv | sed -e '1d'

こうしようと書いてありました。正しいと思います。

Perl で

perl -nle '@t=split(/,/);print $t[0] if $t[0] =~ /\d.*/' members.csv

cut & sed より少し長いですがいくつかのメリットがあります。
まず直感的ですよね。(感覚は人にもよると思いますが)

「カンマでスプリット(分割)して、そのうちの0番目(先頭)がもし数値であれば、それを出力してね。」

という風に、まるで自然言語を読む感覚で理解できます。
そして次のメリットとして、応用が効きます。

例えばそのID に全て () をつけて欲しいという依頼があれば、プログラミング的にはただの文字列の連結が追加されるだけですから、先程のを少し改良して

perl -nle '@t=split(/,/);print "(".$t[0].")" if $t[0] =~ /\d.*/' members.csv
(1)
(2)
(3)
(4)
(5)

こう書けばよいだけですし、偶数列だけ出力したいなんていわれれば

perl -nle '@t=split(/,/);print $t[0] if $t[0] =~ /\d.*/ && $t[0] % 2 == 0' members.csv 

このように改良すればよい。

2
4

Perl はどこにでもだいたいある

最後に、cut やsed もどの環境にでもだいたいあるとは思いますが、Perl も負けじとだいたいどの環境にもあります。Mac でもLinux でも。ですから、上記のワンライナーは、Mac やUbuntu を使っている方であれば、そのまますぐに実行できます。そういう意味でもおすすめです。

cut やsed の魔法をつかいこなせるのは格好いいかもしれませんが、僕が思うに、利用範囲が狭い -> 利用頻度が低い -> 覚えにくい -> 毎回使い方をググるってことになりかねません。

その点Perl であれば応用範囲が広くて、使用頻度が高くなるので、結果的に手に馴染むと思います。いかがでしょうか。

4
6
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
4
6