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コマンドを使って以下の手順で処理する。

  1. revコマンドで逆順にする
  2. cutコマンドでカンマ区切りのn列目を取得する (nは後ろから数えた列番号)
  3. 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をパースするツールや簡単なプログラムを書く必要がある。