cut コマンドで後ろから数えたフィールドを取得したい
以下のようなデータにカンマを含む場合はダブルクオートで囲って区切り文字とは区別するようなCSVファイルを考える。
aaaaaaa,foo,12345,fizz
"aa,aa",bar,12345,buzz
1列目のデータにカンマが含まれている。
上記データをcutコマンドで2列目を取得したい場合、1列目にカンマがあるためカンマで区切った2列目を指定してもうまく取得できない。
$ cut -d, -f2 test.csv
foo
aa"
cut コマンドで後ろから数えたフィールドを取得する
cutコマンドで後ろから数えたフィールドを取得するには、rev
コマンドを使って以下の手順で処理する。
- revコマンドで逆順にする
- cutコマンドでカンマ区切りのn列目を取得する (nは後ろから数えた列番号)
- revコマンドで逆順に戻す
上記のtest.csvの2列目は後ろから数えると3列目なので以下のようなコマンドで取得できる。
$ rev test.csv | cut -d, -f3 | rev
foo
bar
1ステップずつ確認してみる
$ cat test.csv
aaaaaaa,foo,12345,fizz
"aa,aa",bar,12345,buzz
# 逆順にする
$ rev test.csv
zzif,54321,oof,aaaaaaa
zzub,54321,rab,"aa,aa"
# 後ろから3列目を取得する
$ $ rev test.csv | cut -d "," -f 3
oof
rab
# 逆順にする
$ rev test.csv | cut -d "," -f 3 | rev
foo
bar
注意点
後ろのほうにカンマがある場合はやはりうまくいかない。
$ cat test.csv
aaaaaaa,foo,12345,fizz
"aa,aa",bar,12345,"bu,zz"
$ rev test.csv | cut -d "," -f 3 | rev
foo
12345
このような場合はCSVをパースするツールや簡単なプログラムを書く必要がある。
\第一線のプログラマーの行動原理を学べる!/