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