Bash

從 BASH 中的 CSV 文件中讀取空字元串

  • August 1, 2021

我正在使用以下gawk腳本從 csv 文件 file.csv 的第一列中讀取值。
我使用它gawk是因為我不想忽略任何嵌入的逗號。

col=`gawk ' 
BEGIN {
FPAT="([^,]+)|(\"[^\"]+\")"
}
{print $1 }' file.csv`

例如,file.csv 是:

col1,col2
"a,a","a,a1"
,"b1"
"c","c1"

問題是由於第一列的第二行是空的,當它從第一列讀取值時,它會將第二列的值作為第二行的值。

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 

我能做些什麼來解決這個問題?

+將s (1 次或多次重複)更改為*s (0 次或多次重複),FPAT以便允許空欄位:

$ awk '
BEGIN { FPAT="([^,]*)|(\"[^\"]*\")+" }
{ print $1 }
' file.csv
col1
"a,a"

"c"

我還添加了一個final +,因此它允許在您引用的欄位中使用轉義(雙引號)引號,例如"foo""bar".

有關使用 awk 解析 CSV 的更多資訊,請參閱https://stackoverflow.com/questions/45420535/whats-the-most-robust-way-to-efficiently-parse-csv-using-awk,即使欄位包含換行符。


如評論中所述,這將在 gawk 5.1.0 及更高版本中工作,但由於與處理相關的 2 個錯誤,您可能無法將上述內容與 gawk 4.1.4 一起使用FPAT

  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 }為第一行。

引用自:https://unix.stackexchange.com/questions/660403