我正在為 Oracle SQL Loader 使用以下輸入。我從服務下載的 CSV 檔案現在有一個 CRLF
我嘗試過
dos2unix
tr '\n' ',' < input.txt > output.txt
awk '{printf "%s\r\n", $0}' file
但沒有運氣。
樣本資料 :
"ID","NAME","GROUP","Free Text [CR][LF]
[CR][LF]
[CR][LF]
[CR][LF]
"
"ID1","NAME1","GROUP1","Free Text1 [CR][LF]
"
期望的輸出:
"ID","NAME","GROUP","Free Text"
"ID1","NAME1","GROUP1","Free Text1"
請建議一個有幫助的程式碼或指令
先致謝
答案1
$ perl -pe 'while(m/\r$/) { $_ .= readline }; s/\r\n//g' rgram.txt
"ID","NAME","GROUP","Free Text"
"ID1","NAME1","GROUP1","Free Text1"
\r$
這將以 CRLF (或)結尾的連續行連接\r\n
成一長行,然後從該行中剝離所有 CRLF 對並列印它。
修改後的輸入將列印到 stdout,該輸出可以重定向到另一個檔案。或使用perl
的-i
選項就地修改原始檔案:
$ perl -i.bak -pe 'while(m/\r$/) { $_ .= readline }; s/\r\n//g' rgram.txt
這將保持原來的rgram.txt.bak
。
我不喜歡使用-i
,我寧願將標準輸出重定向到,例如rgram.new
。寫入標準輸出更加通用(您可以將其傳輸到其他程序,或在進程或命令替換等中使用它),並且錯誤破壞原始檔案的風險較小。
rgram.txt
是一個文字文件,包含問題中描述的範例資料:
$ sed -n l rgram.txt
"ID","NAME","GROUP","Free Text\r$
\r$
\r$
\r$
"$
"ID1","NAME1","GROUP1","Free Text1\r$
"$
答案2
sed 's/"$//' rgram.csv | sed 's/$/"/' | sed '/^"$/d' > rgram.new.csv
我首先從文件中刪除了最後一個“字符,然後將其添加回來,然後刪除以”開頭的行。
答案3
我看到您想刪除 CRLF 序列,但保留 LF 而不單獨前面的 CR,所以:
perl -pe 's/\r\n//' < input.txt > output.txt
或者:
gawk -v RS='\r\n' -v ORS= 1 < input.txt > output.txt