Unix Shell CRLF は空白に置き換えられます。

Unix Shell CRLF は空白に置き換えられます。

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\n1つの長い行に連結し、その行からすべての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シーケンスを削除したいが、先行CRなしでLFのみを維持したい場合があるので、次のようにします。

perl -pe 's/\r\n//' < input.txt > output.txt

または:

gawk -v RS='\r\n' -v ORS= 1 < input.txt > output.txt

関連情報