Ich versuche, eine Textdatei in eine tabulatorgetrennte Tabelle zu konvertieren. Meine Textdatei sieht ungefähr so aus:
Dog
Cat
Fish
Lizard
Wolf
Lion
Shark
Gecko
Coyote
Puma
Eel
Iguana
Mit den Standardfunktionen zum Suchen und Ersetzen in Gedit oder LibreOffice ist es einfach, das Zeilenende durch eine Registerkarte zu ersetzen. Aber wenn ich nur die Wagenrückläufe gegen Tabs 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 gegen eine Registerkarte mit Ausnahme jeder vierten Zeile austauschen?
Ich weiß nicht, ob diese Art der bedingten Iteration mit regulären Ausdrücken in einem Programm wie Gedit oder LibreOffice durchgeführt werden kann. Vielleicht muss dies also eine Art Befehlszeilenfunktion sein? Mir ist nicht einmal klar, mit welchem Tool ich am besten anfangen soll.
Aktualisieren:
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, die resultierende tsv
Datei in LibreOffice zu öffnen , sind die Spalten nicht ganz richtig. Ich bin nicht sicher, ob dies bedeutet, dass ich die oben genannten Befehle nicht korrekt ausführe oder ob ich in der LibreOffice-Importfunktion etwas falsch mache:
Nur als Referenz sollte das gewünschte Ergebnis folgendermaßen aussehen:
quelle
dos2unix
undunix2dos
.Sie können
xargs
immer vier Zeilen zu einer gruppieren, die jeweils durch ein Leerzeichen getrennt sind:-d '\n'
Setzt das Eingabetrennzeichen auf ein Zeilenumbruchzeichen, da es sonst auch bei Leerzeichen unterbrochen wird. Wenn Sie ohnehin nur ein Wort pro Eingabezeile haben, können Sie dies sogar weglassen.-n4
Setzt die Argumentnummer (die Anzahl der Eingabeelemente pro Ausgabezeile) auf 4.Ausgabe:
Wenn Sie Registerkarten als Trennzeichen anstelle eines Leerzeichens verwenden möchten, können Sie diese anschließend ersetzen. Wenn Sie jedoch Leerzeichen in Ihren Eingabezeilen hätten, würden diese ebenfalls ersetzt:
Ausgabe (abhängig von der Registerkartenbreite des Browsers / Terminals):
quelle
Sie könnten auch verwenden:
Die zwei integrierten awk-Variablen sind:
ORS
: O utput R ECORD S eparator (default = Neue - Zeile). Es wird am Ende jedes Druckbefehls hinzugefügt.NR
: N umber des aktuellen R ow awk verarbeitet.Dieser Befehl zeigt für jede Zeile den Inhalt der ersten (und nur hier) Spalte an. Anschließend wird eine neue Zeile oder eine Registerkarte hinzugefügt, indem der Rest der Division
NR
von 4 getestet wird.quelle
Ein weiterer kürzester
awk
Ansatz:Diese printf die nur eine Spalte , gefolgt von nächsten und übernächsten und ... und ein Tab
\t
Zeichen nach jeder aber wird printf einen\n
ewline Charakter , wenn N Umbra von R ecord Faktor war 4 (woNR%4
zurückkehren 0 (false) , das , was Ternary Operator istcondition(s)?when-true:when-false
macht gerade.)quelle
Meine Lösung hierfür wäre die Verwendung einer Kombination aus
sed
undsed
. Erstens könnten Sie jede vierte Zeile mit einem Sonderzeichen markieren, beispielsweise>
mit dieser Lösung:In diesem Fall möchten Sie mit Zeile 5 beginnen und jede vierte Zeile danach markieren. In GNU
sed
kann dies als Adresse angegeben werden5~4
. Sie können diesen Befehl verwenden:Dann müssen Sie die Zeilenumbrüche entfernen, was mit einer
sed
Schleife erfolgen kann:Es gibt einfachere Möglichkeiten, Zeilenumbrüche in andere Zeichen umzuwandeln, z. B
tr
.:In beiden Fällen ergibt die Kombination der beiden
(Die
sed
Version hinterlässt einen nachgestellten Zeilenumbruch, dietr
Version jedoch nicht.)Danach müssen Sie nur noch die von Ihnen eingefügten Sonderzeichen in Zeilenumbrüche konvertieren. Siehe zum Beispiel Konvertieren einer durch Tabulatoren getrennten Datei, um Zeilenumbrüche zu verwenden . Wechseln Sie
>
in diesem Fall zu Zeilenumbrüchen:Der
y
Befehl hat dieselbe Funktion wie dastr
Transformieren eines Zeichens in ein anderes, aber Sie können dens
Befehl hier genauso gut verwenden. Mits
müssen Sieg
jedes Match in der Zeile (sed 's/>/\n/g'
) bearbeiten.Anstatt zwei Zwischendateien zu erstellen, können Sie Pipes verwenden:
Wenn nachgestellte Leerzeichen ein Problem darstellen, können Sie einen weiteren Befehl hinzufügen, um sie zu entfernen:
quelle
Der "Vollständigkeit halber" ist hier eine reine Bash-Lösung:
Funktioniert auch mit Leerzeichen, vorausgesetzt, es
IFS
ist richtig eingestellt (was standardmäßig AFAIK sein sollte). Darüber hinaus denke ich, dass dies sogar ein portables Shell-Skript sein und mit jeder POSIX-kompatiblen Shell funktionieren könnte.quelle
$'
'
Form des Zitierens von POSIX nicht benötigt wird. Beispiel: Indash
(dassh
standardmäßig unter Ubuntu bereitgestellt wird) werdenprintf '%s\n' $'a\tb'
nur Ausgaben ausgeführt$a\tb
. Das heißt aber nicht, dass dies nicht nützlich ist. es funktioniert in bash. Wie bei einigen anderen Lösungen, die veröffentlicht wurden, wird jedoch eine unvollständige Ausgabe erstellt, wenn die Anzahl der Eingabezeilen nicht ein Vielfaches von vier ist. Außerdem empfehle ich die Verwendungread -r
, da hier kein Grund zu der Annahme besteht, dass die Erweiterung von Backslash-Escapezeichen in der Eingabedatei erwünscht ist.printf '%s\t%s\t%s\t%s\n' "$one" "$two" "$three" "$four"
Ein vim-Makro (aufgezeichnet mit q) kann Ihre Operation anwenden und dann drei Zeilen überspringen. Dann führen Sie dieses Makro nur n Mal aus.
z.B:
quelle
Da Sie nach einer Gedit-Lösung gefragt haben, sollte so etwas funktionieren:
Finden:
Ersetzen mit:
Stellen Sie sicher, dass das Kontrollkästchen für reguläre Ausdrücke aktiviert ist.
Wie es funktioniert:
Der erste Schritt besteht darin, eine Reihe von Wortzeichen mit \ w + zu finden und die Ergebnisse in der Variablen \ 1 zu erfassen, indem der Ausdruck in Klammern gesetzt wird:
Als nächstes suchen wir nach einer Reihe von Zeilenendezeichen \ r und \ n oder CR und LF. Da Windows-formatierte Dateien beide verwenden, erstellen wir eine Zeichenklasse, indem wir diese beiden Zeichen in eckige Klammern setzen. Mit dem Plus wird nach einem oder mehreren Zeichen gesucht:
Schließlich wiederholen wir dies noch dreimal und speichern jedes nachfolgende Wort in den Variablen \ 2, \ 3 und \ 4. Dies macht unser Ersetzen durch Ausdruck einfach. Wir müssen nur die Tabulatorzeichen \ t und ein neues Zeilenzeichen \ n an den entsprechenden Stellen für die gewünschte Formatierung platzieren.
quelle