お仕事をしていると、CSVファイルを扱うことも多いと思います。また、そこから一部のデータだけ欲しいということも多々あると思います。
エクセルでCSVファイルを開いて必要なところだけをコピペすればいいじゃない、と思うかもしれません。
しかし、行数が10万行あったらどうしましょう。またたった数千行数万行だったとしてもエクセルで開くだけで時間がかかってしまったりしてなかなか仕事が進みません。
実は、コマンドを一発打つだけで必要なデータだけを抜き取る事ができちゃうんです。
cutコマンド
例として、cutコマンドでCSVファイルの2列目と3列目だけを抜き取ってみます。
$ cat sample.txt
id,name,age,sex,occupation
1,田中,25,男性,会社員
2,鈴木,43,女性,経営者
3,佐藤,23,女性,主婦
4,伊藤,32,男性,会社員
こんなサンプルテキストを用意しました。
目的は、このファイルの name
とage
だけを抜き取る事です。
dオプションとfオプション
cutコマンドのdオプションとfオプションを使います。
dオプション:区切り文字を指定します。この場合はCSVなのでカンマを指定します
fオプション:何列目のデータを抜き取りたいかを指定します。この場合は2と3を指定します。
コマンド
$ cut -d',' -f 2,3 sample.txt
結果
name,age
田中,25
鈴木,43
佐藤,23
伊藤,32
目的通りにnameとageを抜き取る事ができました。あと、この結果を別ファイルに保存したいですよね。コピペでも出来るのですが、それだとデータ量が多いときに大変です。そこで、リダイレクトを使います。
$ cut -d',' -f 2,3 sample.txt > name_and_age.txt
$ cat name_and_age.txt
name,age
田中,25
鈴木,43
佐藤,23
伊藤,32
いい感じです。でも、もし順番を変えたいとなったらどうしましょう・・・・?
cutコマンドでは抜粋の順番を入れ替えられない
実はcutコマンドでは順番は変えることはできません。試しに fオプション の順番を変えてやってみましょう。
$ cut -d',' -f 3,2 sample.txt
name,age
田中,25
鈴木,43
佐藤,23
伊藤,32
順番変わらず。。。。です。゚(゚´ω`゚)゚。
そこで、AWKコマンドです。
awkなら順番入れ替えも出来る
実行例
$ awk -F',' -v 'OFS=,' '{print $2,$1,$4,$3}' sample.txt
name,id,sex,age
田中,1,男性,25
鈴木,2,女性,43
佐藤,3,女性,23
伊藤,4,男性,32
順番が変わっていますね。何をしているか1つ1つ見てみましょう。
Fオプション
デリミター(区切り文字)を指定します。
Vオプション
環境変数を定義します。
OFS
出力の区切り文字を指定します。
例えば、出力はカンマじゃなくてシャープがいい、という場合は下記のようにします。
$ awk -F',' -v 'OFS=###' '{print $2,$1,$4,$3}' sample.txt
name###id###sex###age
田中###1###男性###25
鈴木###2###女性###43
佐藤###3###女性###23
伊藤###4###男性###32
ここで出力する順番を指定します。上で実行したのは、2列目1列目4列目3列目の順番で出力されるように指定しています。
速度
さて、大きなファイルでも瞬殺出来るのかテストしてみます。
15万行のファイルを用意しました。上で使ったsample.txtの中身をコピペしまくっただけのテキストファイルです。
$ wc sample.txt
152497 152497 4340130 sample.txt
このファイルから4列目のデータと2列目のデータを抜き取ってみたいと思います。
$ awk -F',' -v 'OFS=,' '{print $4,$2}' sample.txt > awk_15_man_gyo.txt
1秒かかりませんでした。。。
上のコマンドを実行したところ1秒かかりませんでした。。。
エクセルなど他のエディタで開いてコピペするより断然速いですね。
皆さんもこれからファイルからのデータ抜粋するという事案が出た場合はぜひawkコマンドを使ってみてください。