Unix Shell CRLF wird durch Leerzeichen ersetzt

Unix Shell CRLF wird durch Leerzeichen ersetzt

Ich verwende die folgende Eingabe für Oracle SQL Loader. Die Datei, die ich als CSV vom Service heruntergeladen habe, hat jetzt ein CRLF

Ich habe versucht,

dos2unix 
tr '\n' ',' < input.txt > output.txt
awk '{printf "%s\r\n", $0}' file

aber kein Glück.

Beispieldaten :

"ID","NAME","GROUP","Free Text [CR][LF]
[CR][LF]
[CR][LF]
[CR][LF]
"
"ID1","NAME1","GROUP1","Free Text1 [CR][LF]
"

Gewünschte Ausgabe:

"ID","NAME","GROUP","Free Text"
"ID1","NAME1","GROUP1","Free Text1"

Bitte schlagen Sie einen Code oder Befehl vor, der hilfreich sein wird

Dank im Voraus

Antwort1

$ perl -pe 'while(m/\r$/) { $_ .= readline }; s/\r\n//g' rgram.txt
"ID","NAME","GROUP","Free Text"
"ID1","NAME1","GROUP1","Free Text1"

Dadurch werden aufeinanderfolgende Zeilen, die mit CRLF ( \r$oder \r\n) enden, zu einer langen Zeile zusammengefügt, dann werden alle CRLF-Paare aus dieser Zeile entfernt und die Zeile wird ausgedruckt.

Die geänderte Eingabe wird auf stdout ausgegeben und kann in eine andere Datei umgeleitet werden. Oder verwenden Sie perldie -iOption , um die Originaldatei direkt zu ändern:

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

Dadurch bleibt das Original erhalten rgram.txt.bak.

Ich bin kein Fan der Verwendung von -i, ich würde stdout lieber einfach umleiten, z. B. auf rgram.new. Das Schreiben auf stdout ist vielseitiger (Sie können es in andere Programme weiterleiten oder es in Prozess- oder Befehlsersetzungen usw. verwenden) und es besteht ein geringeres Risiko, dass ein Fehler die Originaldatei zerstört.


rgram.txtist eine Textdatei, die die Beispieldaten wie in der Frage beschrieben enthält:

$ sed -n l rgram.txt 
"ID","NAME","GROUP","Free Text\r$
\r$
\r$
\r$
"$
"ID1","NAME1","GROUP1","Free Text1\r$
"$

Antwort2

sed 's/"$//' rgram.csv | sed 's/$/"/' | sed '/^"$/d' > rgram.new.csv

Ich habe zuerst das letzte "-Zeichen aus der Datei entfernt, es dann wieder hinzugefügt und anschließend die Zeile entfernt, die mit " beginnt.

Antwort3

Ich sehe, Sie möchten die CRLF-Sequenzen entfernen, aber das LF ohne vorangestelltes CR unverändert lassen, also:

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

oder:

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

verwandte Informationen