GNU/Linux >> LINUX-Kenntnisse >  >> Ubuntu

Ist es mit Gedit oder der Befehlszeile möglich, jede vierte Zeile einer Textdatei zu ändern?

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 :

  1. 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?
Ubuntu
  1. Lassen Sie sich mit sort in der Befehlszeile sortieren

  2. Ausführen eines Befehls für jede Zeile in einer Textdatei

  3. Laden Sie eine Datei auf Ubuntu über die Befehlszeile auf einem Ubuntu 20.04-System herunter

  4. Mehrere Dateitexte durch Sed ersetzen?

  5. Erstellen Sie Dateien mithilfe der Befehlszeile in Linux

So laden Sie eine Datei auf Ubuntu über die Befehlszeile herunter

Bearbeiten von Text in der Befehlszeile mit grep

Zeiterfassung mit Timewarrior auf der Kommandozeile

So laden Sie eine Datei unter Ubuntu Linux über die Befehlszeile herunter

Zeigen Sie den Inhalt einer Datei in der Linux-Befehlszeile an

Cat-Befehl zeigt die Textzeilen nicht an?