Unix シェルの CRLF をスペースに置き換える

Unix シェルの 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"

これは、CRLF (\r$または\r\n) で終わる連続する行を 1 つの長い行に結合し、その行からすべての CRLF ペアを削除して出力します。

変更された入力は stdout に出力され、別のファイルにリダイレクトできます。または、perl-iオプションを使用して元のファイルをその場で変更します。

$ perl -i.bak -pe 'while(m/\r$/) { $_ .= readline }; s/\r\n//g' rgram.txt

これにより、元の状態が維持されますrgram.txt.bak

私は を使用するのが好きではありませ-iん。stdout を、たとえば にリダイレクトするだけです。stdoutrgram.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

関連情報