Ich versuche, eine Textdatei in eine tabulatorgetrennte Tabelle umzuwandeln. Meine Textdatei ist in etwa so:
Dog
Cat
Fish
Lizard
Wolf
Lion
Shark
Gecko
Coyote
Puma
Eel
Iguana
Mit den Standard-Such- und Ersetzungsfunktionen in Gedit oder LibreOffice ist es einfach, das Zeilenende durch einen Tabulator zu ersetzen. Aber wenn ich Wagenrückläufe gegen Tabulatoren tausche, bekomme ich Folgendes:
Dog Cat Fish Lizard Wolf Lion Shark Gecko Coyote Puma Eel Iguana
Aber was ich tun muss, ist, dass es so aussieht:
Dog Cat Fish Lizard
Wolf Lion Shark Gecko
Coyote Puma Eel Iguana
Kann ich also jedes Zeilenendezeichen durch einen Tabulator ersetzen außer für jede vierte Zeile?
Ich weiß nicht, ob diese Art von bedingter Iteration mit regulären Ausdrücken in einem Programm wie Gedit oder LibreOffice durchgeführt werden kann, also muss dies vielleicht eine Art Befehlszeilenfunktion sein? Mir ist nicht einmal klar, was das beste Tool für den Anfang ist.
Aktualisierung:
Ich habe die folgenden Befehle ausprobiert:
sed 'N;N;N;s/\n/\t/g' file > file.tsv
paste - - - - < file > file.tsv
pr -aT -s$'\t' -4 file > file.tsv
xargs -d '\n' -n4 < inputfile.txt
Aber wenn ich versuche, das resultierende tsv
zu öffnen Datei in LibreOffice sind die Spalten nicht ganz richtig. Ich bin mir nicht sicher, ob dies bedeutet, dass ich die obigen Befehle nicht korrekt ausführe oder ob ich in der Importfunktion von LibreOffice etwas falsch mache:
Nur als Referenz, das gewünschte Ergebnis sollte so aussehen:
Akzeptierte Antwort:
Sie könnten Verwenden Sie einen Befehlszeilen-Editor wie sed
sed 'N;N;N;s/\n/\t/g' file > file.tsv
oder programmatischer durch Hinzufügen von Backslash Zeilenfortsetzungszeichen mit n skip m
von GNU sed zu jeder der Zeilen, die Sie verbinden möchten Adressoperator und danach den klassischen Einzeiler zum Verbinden von Fortsetzungszeilen:
sed '0~4! s/$/\t\\/' file | sed -e :a -e '/\\$/N; s/\\\n//; ta'
Siehe zum Beispiel Sed One-Liner Explained :
-
Fügt eine Zeile an die nächste an, wenn sie mit einem Backslash „\“ endet.
sed -e :a -e '/\\$/N; s/\\\n//; ta'
Allerdings wäre es IMHO einfacher mit einem der anderen Standard-Textverarbeitungsprogramme, z. B.
paste - - - - < file > file.tsv
(die Anzahl von -
entspricht der Anzahl der Spalten) oder
pr -aT -s$'\t' -4 file > file.tsv
(Sie können -s$'\t
weglassen wenn Sie nichts dagegen haben, dass die Ausgabe durch mehrere Tabulatoren getrennt wird).
Das seltsame Re-Import-Verhalten, das Sie beobachten, ist mit ziemlicher Sicherheit darauf zurückzuführen, dass die Originaldatei CRLF-Zeilenenden im Windows-Stil hat. Wenn Sie mit Dateien von Windows arbeiten müssen, können Sie die Konvertierung auf verschiedene Arten in den Befehl packen, z. B.
tr -d '\r' < file.csv | paste - - - -
oder
sed 'N;N;N;s/\r\n/\t/g' file.csv
Ersteres entfernt ALLE Wagenrückläufe, während letzteres ein CR am Ende jeder der neuen Zeilen beibehält (was Sie möglicherweise möchten, wenn der beabsichtigte Endbenutzer Windows verwendet).
Verwandte:Wacom Grafiktablett Cth-480 / Ctl-480 nicht in Ubuntu 13.10 in Ubuntu erkannt?