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解析モジュールで高度なスクリプト言語を使用するのが最善です。