示例輸入資料::
cat test.csv
234,aa,bb,cc,30,dd
22,cc,
ff,dd,
40,gg
pxy,aa,,cc,
40
,dd
需要的輸出 ::
cat test_new.csv
234,aa,bb,cc,30,dd
22,cc,ff,dd,40,gg
pxy,aa,,cc,40,dd
我嘗試了各種awk和sed命令,似乎都沒有成功。
eg:: awk 'NR == 1{ printf $0; next } { printf "%s%s", (/^[0-9] ,/? ORS : ""), $0 } END{ print "" }'
上面的awk只尋找帶有", "的數字字符,但如果數字出現在帶有新行字符的列中,這將創建額外的行。
輸入檔案包含Control M字符,我已經用dos2unix洗掉了這些字符
。uj5u.com熱心網友回復:
關于 "輸入檔案包含Control M字符,我已經用dos2unix洗掉了"--這可能會使你的生活更加困難。很有可能一行中的 "換行 "只是LF,而記錄的結尾是CRLF,所以通過洗掉CR,我們不能再簡單地將awk的RS設定為CRLF,然后洗掉記錄中剩余的任何LF。
如果你的檔案是由Excel匯出的,正如你在問題下的評論中所說的,那么,無論欄位是否有引號,它都會在每條記錄的末尾使用CRLF,并且在每個欄位中單獨使用LF,如果你不對它運行dos2unix,看起來是這樣的:
$ cat -v test.csv
234,aa,bb,cc,30,dd^M
22,cc,
ff,dd,
40,gg^M
pxy,aa,,cc,
40
,dd^M
那么使用任何awk:
$ awk -v ORS= '{sub(/)
$/,"
")} 1' test.csv
234,aa,bb,cc,30,dd
22,cc,ff,dd,40,gg
pxy,aa,,cc,40,dd
或者,如果你愿意,使用GNU awk來處理多字符RS:
$ awk -v RS='
' '{gsub(/
/,"")} 1' test.csv
234,aa,bb,cc,30,dd
22,cc,ff,dd,40,gg
pxy,aa,,cc,40,dd
關于用awk決議CSV的更多資訊,請參見用awk有效決議CSV的最有力的方法是什么?。
。關于你的原始腳本--永遠不要使用printf $0,而應該使用printf "%s", $0,因為當$0包含任何printf格式化的字符(如%s)時,前者會失敗:
$ echo 'a%sb'/span> | awk '{printf "%s", $0}'
a%sb$
$ echo 'a%sb' | awk '{printf $0}' A%sb$
awk: cmd. line:1: (FILENAME=- FNR=1) fatal: 沒有足夠的引數來滿足格式字串
`a%sb'
^這個用完了
$
這適用于在所有輸入資料上使用printf。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/318334.html
標籤:
上一篇:獲取每月同一天的日期
