BASHのCSVファイルから空の文字列を読み取る

BASHのCSVファイルから空の文字列を読み取る

gawkcsvファイル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で上記の内容を使用するのに問題がある可能性があります。

  1. https://lists.gnu.org/archive/html/bug-gawk/2017-04/msg00000.html
  2. https://lists.gnu.org/archive/html/bug-gawk/2019-11/msg00000.html

その場合は、次のいずれかの方法でこれらのエラーを解決できます。

  1. NFたとえば、最初の行に追加するなど、スクリプトの先頭に引用する{ NF }必要がありますが、それでも機能しない場合
  2. FPATスクリプトの先頭を消去して再割り当てします(たとえば、{ oFPAT=FPAT; FPAT=""; FPAT=oFPAT }最初の行として追加)。

答え2

awk -F ',"' 'NR>1{gsub(/\"/,"",$1);print $1}' filename

出力

a,a

c

関連情報