我有一個很大的 CSV 欄位,我使用 awk 并將欄位分隔符設定為逗號。但是,某些欄位被參考并包含逗號,我正面臨這個問題:
原始檔案:
Downloads $ cat testfile.csv
"aaa","bbb","ccc","dddd"
"aaa","bbb","ccc","d,dd,d"
"aaa","bbb","ccc","dd,d,d"
我正在嘗試這種方式:
Downloads $ cat testfile.csv | awk -F "," '{ print $2","$3","$4 }'
"bbb","ccc","dddd"
"bbb","ccc","d
"bbb","ccc","dd
預期結果:
"bbb","ccc","dddd"
"bbb","ccc","d,dd,d"
"bbb","ccc","dd,d,d"
uj5u.com熱心網友回復:
在欄位分隔符標志中包含(轉義)引號,并將它們添加到輸出列印欄位中:
testfile.csv | awk -F "\",\"" '{print "\""$2"\",\""$3"\",\""$4}'
輸出:
"bbb","ccc","dddd"
"bbb","ccc","d,dd,d"
"bbb","ccc","dd,d,d"
uj5u.com熱心網友回復:
我會使用能夠正確決議 CSV 的工具,例如xsv。有了它,命令看起來像
$ xsv select 2-4 testfile.csv
bbb,ccc,dddd
bbb,ccc,"d,dd,d"
bbb,ccc,"dd,d,d"
或者,如果您真的想要參考每個值,請執行第二步:
$ xsv select 2-4 testfile.csv | xsv fmt --quote-always
"bbb","ccc","dddd"
"bbb","ccc","d,dd,d"
"bbb","ccc","dd,d,d"
uj5u.com熱心網友回復:
如果gawk或GNU awk可用,您可以使用FPAT匹配欄位的 ,而不是在欄位分隔符上拆分。
awk -v FPAT='([^,] )|(\"[^\"] \")' -v OFS=, '{print $2, $3, $4}' testfile.csv
結果:
"bbb","ccc","dddd"
"bbb","ccc","d,dd,d"
"bbb","ccc","dd,d,d"
該字串([^,] )|(\"[^\"] \")是一個正則運算式模式,它與以下任一匹配:
([^,] )... 匹配逗號以外的任何字符序列。(\"[^\"] \")... 匹配用雙引號括起來的字串(其中可能包括逗號)。
模式周圍的括號用于視覺清晰目的,正則運算式將在沒有它們的情況下作業,例如FPAT='[^,] |\"[^\"] \"'因為替代方案|的優先級較低。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/447756.html
