it-swarm.com.de

Shell ersetzt cr \ lf durch Komma

Ich habe input.txt

1
2
3
4
5

Ich brauche eine solche output.txt

1,2,3,4,5

Wie es geht?

42
vinnitu

Versuche dies:

tr '\n' ',' < input.txt > output.txt
64
eumiro

Mit sed können Sie Folgendes verwenden:

sed -e 'H;${x;s/\n/,/g;s/^,//;p;};d'

Das H fügt den Musterbereich an den Haltebereich an (Speichern der aktuellen Zeile im Haltebereich). Das ${...} umgibt Aktionen, die nur für die letzte Zeile gelten. Diese Aktionen sind: x Swap Hold und Pattern Space; s/\n/,/g eingebettete Zeilenumbrüche durch Kommas ersetzen; s/^,// lösche das führende Komma (es gibt eine neue Zeile am Anfang des Haltebereichs); und p print. Das d löscht den Musterbereich - kein Druck.

Sie könnten also auch verwenden:

sed -n -e 'H;${x;s/\n/,/g;s/^,//;p;}'

Das -n unterdrückt den Standarddruck, sodass das endgültige d nicht mehr benötigt wird.

Bei dieser Lösung wird davon ausgegangen, dass die CRLF-Zeilenenden die lokale native Zeilenende sind (Sie arbeiten also unter DOS), und dass sed daher die lokale native Zeilenende beim Druckvorgang generiert. Wenn Sie eine Eingabe im DOS-Format haben, aber eine Ausgabe im Unix-Format (nur LF) möchten, müssen Sie etwas härter arbeiten - dies müssen Sie jedoch auch explizit in der Frage festlegen.

Unter MacOS X 10.6.5 funktionierte es mit den Nummern 1..5 und 1..50 sowie 1..5000 (23.893 Zeichen in der einzelnen Ausgabezeile) einwandfrei. Ich bin mir nicht sicher, ob ich es noch härter machen möchte.

18

Als Antwort auf @ Jonathans Kommentar zu @ eumiros Antwort:

tr -s '\r\n' ',' < input.txt | sed -e 's/,$/\n/' > output.txt
11
glenn jackman

tr und sed waren früher sehr gut, aber wenn es um das Parsen und Regex von Dateien geht, kann man Perl nicht schlagen. .)

Perl -pe 's/\n/$1,/' your_file

wenn Sie möchten, dass pure Shell dies tut, schauen Sie sich den String Matching an

${string/#substring/replacement}
10
Arnaud
  • Awk versions:
    • awk '{printf("%s,",$0)}' input.txt
    • awk 'BEGIN{ORS=","} {print $0}' input.txt
    • Ausgabe - 1,2,3,4,5,

Da Sie nach 1,2,3,4,5 Gefragt haben, im Vergleich zu 1,2,3,4,5, (Beachten Sie das Komma nach 5, die meisten der obigen Lösungen enthalten auch das nachgestellte Komma), sind hier zwei weitere Versionen mit Awk (mit wc und sed), um das letzte Komma zu entfernen:

  • i='input.txt'; awk -v c=$(wc -l $i | cut -d' ' -f1) '{printf("%s",$0);if(NR<c){printf(",")}}' $i

  • awk '{printf("%s,",$0)}' input.txt | sed 's/,\s*$//'

7
gsbabil

Verwenden Sie den Befehl Einfügen. Hier werden Pipes verwendet:

echo "1\n2\n3\n4\n5" | paste -s -d, /dev/stdin

Hier wird eine Datei verwendet:

echo "1\n2\n3\n4\n5" > /tmp/input.txt
paste -s -d, /tmp/input.txt

Pro Manpage verknüpft das s alle Zeilen und d erlaubt die Definition des Begrenzungszeichens.

4
Nestor Urquiza
cat input.txt | sed -e 's|$|,|' | xargs -i echo "{}"
1
Noel Yap
  • Python-Version:

    python -c 'import sys; print(",".join(sys.stdin.read().splitlines()))'

Das Problem mit dem nachgestellten Komma tritt nicht auf (da join auf diese Weise funktioniert), und splitlines teilt Daten an nativen Zeilenenden auf (und entfernt sie).

1
qneill