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 perl
die -i
Option , 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.txt
ist 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