Bash
從 BASH 中的 CSV 文件中讀取空字元串
我正在使用以下
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
:
- 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 }
為第一行。