gawk
csvファイルfile.csvの最初の列から値を読み取るには、次のスクリプトを使用しています。含まれているカンマを無視したくないので
使用します。gawk
col=`gawk '
BEGIN {
FPAT="([^,]+)|(\"[^\"]+\")"
}
{print $1 }' file.csv`
たとえば、file.csvは次のようになります。
col1,col2
"a,a","a,a1"
,"b1"
"c","c1"
問題は、最初の列の2行目が空であるため、1列目の値を読み取るときに2列目の値を2行目の値として使用することです。
echo $col
返品
a,a
b1
c
しかし、次のように空の文字列を認識したいと思います。
a,a
c
この動作をどのように達成できますか?
ありがとうございます!
修正する:
空の文字列/スペースが最後の行にある場合、このメソッドはそれを無視することがわかりました。
col=`gawk '
BEGIN {
FPAT="([^,]*)|(\"[^\"]*\")+"
}
{print $1 }' file.csv`
たとえば、file.csvが次のような場合:
col1,col2
"a,a","a,a1"
"b","b1"
,"c1"
結果は次のとおりです。
col1
a,a
b
変える
col1
a,a
b
この問題を解決するにはどうすればよいですか?
答え1
+
空のフィールドを許可するには、s(1回以上繰り返し)を*
s(0回以上繰り返し)に変更します。FPAT
$ awk '
BEGIN { FPAT="([^,]*)|(\"[^\"]*\")+" }
{ print $1 }
' file.csv
col1
"a,a"
"c"
+
また、引用符付きフィールドにエスケープされた(二重引用符)を使用できるように、最後の項目も追加しました"foo""bar"
。
バラよりhttps://stackoverflow.com/questions/45420535/whats-the-most-robust-way-to-efficiently-parse-csv-using-awkフィールドに改行が含まれていても、awkを使用してCSVを解析する方法に関する追加情報。
コメントで述べたように、これはgawk 5.1.0以降で動作しますが、FPAT
処理に関連する2つのバグが原因で、gawk 4.1.4で上記の内容を使用するのに問題がある可能性があります。
- https://lists.gnu.org/archive/html/bug-gawk/2017-04/msg00000.html
- https://lists.gnu.org/archive/html/bug-gawk/2019-11/msg00000.html
その場合は、次のいずれかの方法でこれらのエラーを解決できます。
NF
たとえば、最初の行に追加するなど、スクリプトの先頭に引用する{ NF }
必要がありますが、それでも機能しない場合FPAT
スクリプトの先頭を消去して再割り当てします(たとえば、{ oFPAT=FPAT; FPAT=""; FPAT=oFPAT }
最初の行として追加)。
答え2
awk -F ',"' 'NR>1{gsub(/\"/,"",$1);print $1}' filename
出力
a,a
c