フィールドにカンマが含まれている場合は、「cut」コマンドを使用してCSVファイルのフィールドを切り捨てるにはどうすればよいですか?

フィールドにカンマが含まれている場合は、「cut」コマンドを使用してCSVファイルのフィールドを切り捨てるにはどうすればよいですか?

CSVファイル形式のデータは次のとおりです。

"Pizza,wings,icecream","hopper","0",,"Masdfasdf","USA","381","10 AM","cap",,,"monster"

以下に示すように、カンマを区切り文字として使用すると、カンマ付きのフィールドは区切り文字として計算されますが、これは私が望むものではありません。

cat /path/to/file | cut -d , -f2

戻ってくる

wings

欲しいとき

hopper

論理的な解決策を見つけたようですが、どのように実装するのかわかりません。

「別のカンマや引用符で囲まれたカンマであれば、私を区切り文字と見なします」という区切り文字をどのように作成しますか?


はい

[tksmith@rifle ~]$ cat deleteme 

"Pizza,wings,icecream","hopper","0",,"Masdfasdf","USA","381","10 AM","cap",,,"monster"

[tksmith@rifle ~]$ cat deleteme | cut -d , -f2

wings

答え1

CSV形式には再分析を望まないほど極端なケースが多い。正しいCSVパーサーを使用してください。例えば、ルビーを使うと

ruby -rcsv -e 'CSV.foreach(ARGV.shift) {|row| puts row[1]}' file

答え2

cutコマンドは一度に1文字だけ区切ります。したがって、sedと正規表現を使用して、引用符とカンマを別の単一文字区切り文字に変換できます。たとえば、

sed -e 's/","\|",\|,"\|,,/@/g' /path/to/file | cut -d@ -f2

戻ってくる

hopper

別の方法はAWKを使用することです。たとえば、次は2番目のフィールドを提供します。

awk -F ',,|^"|","|",|,"|"$' '{print $3}' /path/to/file

戻ってくる

hopper

上記の例は、複数の空のフィールドと外部引用符を含むすべてのケースを正しく処理しないため、完全ではありません。 CSV解析モジュールで高度なスクリプト言語を使用するのが最善です。

関連情報