Ich habe die folgenden zwei Dateien (ich habe die Zeilen mit Punkten aufgefüllt, sodass jede Zeile in einer Datei die gleiche Breite hat, und Datei1 mit Großbuchstaben versehen, um sie klarer zu machen).
contents of file1:
ETIAM......
SED........
MAECENAS...
DONEC......
SUSPENDISSE
contents of file2
Lorem....
Proin....
Nunc.....
Quisque..
Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
Beachten Sie, dass Datei2 länger als Datei1 ist.
Wenn ich diesen Befehl ausführe:
paste file1 file2
Ich bekomme diese Ausgabe
ETIAM...... Lorem....
SED........ Proin....
MAECENAS... Nunc.....
DONEC...... Quisque..
SUSPENDISSE Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
Was kann ich tun, damit die Ausgabe wie folgt ist?
ETIAM...... Lorem....
SED........ Proin....
MAECENAS... Nunc.....
DONEC...... Quisque..
SUSPENDISSE Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
Ich habe es versucht
paste file1 file2 | column -t
aber es macht das:
ETIAM...... Lorem....
SED........ Proin....
MAECENAS... Nunc.....
DONEC...... Quisque..
SUSPENDISSE Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
Nicht so hässlich wie die ursprüngliche Ausgabe, aber trotzdem spaltenweise falsch.
text-processing
columns
paste
Tulains Córdova
quelle
quelle
paste
verwendet Tabulatoren vor den Zeilen aus der zweiten Datei. Möglicherweise müssen Sie einen Postprozessor verwenden, um die Spalten entsprechend auszurichten.paste file1 file2 | column -tn
?Antworten:
Angenommen, Ihre Dateien enthalten keine Tabulatorzeichen.
mit dem Argument
-t
entsprechend ausgewählt, um die gewünschte maximale Linienbreite in Datei1 abzudecken.OP hat eine flexiblere Lösung hinzugefügt:
Ich habe das gemacht, damit es ohne die magische Nummer 13 funktioniert:
Es ist nicht einfach zu tippen, kann aber in einem Skript verwendet werden.
quelle
Ich dachte, awk könnte es gut machen, also googelte ich "awk read input from two files" und fand einen Artikel über stackoverflow , der als Ausgangspunkt dienen könnte.
Zuerst ist die komprimierte Version, dann unten vollständig kommentiert. Das Training dauerte mehr als ein paar Minuten. Ich würde mich über einige Verfeinerungen von klügeren Leuten freuen.
Und hier ist die vollständig dokumentierte Version des oben genannten.
quelle
Keine sehr gute Lösung, aber ich konnte es mit
Dabei wird TAB durch das Tabulatorzeichen ersetzt.
quelle
&&
Befehl sed?&
setzt, wonach gesucht wird (in diesem Fall eine Registerkarte). Dieser Befehl ersetzt einfach die Registerkarte am Anfang durch zwei Registerkarten.TAB
,\t
damit dies in zsh unter Ubuntu debian funktioniert. Und es funktioniert nur, wenn Datei1 weniger als 15 Zeichen hatHat unter Debian und Derivaten
column
eine-n
Nomerge- Option, mit der die Spalte mit leeren Feldern das Richtige tun kann.column
Verwendet intern diewcstok(wcs, delim, ptr)
Funktion, die eine breite Zeichenfolge in Token aufteilt, die durch die breiten Zeichen imdelim
Argument begrenzt sind.wcstok
Beginnen Sie mit dem Überspringen breiter Zeichendelim
, bevor Sie den Token erkennen. Die-n
Option verwendet einen Algorithmus, der keine anfänglichen breiten Zeichen überspringtdelim
.Leider ist dies nicht sehr portabel:
-n
ist Debian-spezifisch undcolumn
nicht in POSIX, es ist anscheinend eine BSD-Sache.quelle
Entfernen Sie die Punkte, die Sie zum Auffüllen verwendet haben:
Datei1:
Datei2:
Versuche dies:
Und du wirst bekommen:
quelle
paste
wird auch hier nicht die richtige Ausgabe gedruckt, wenn Zeilen mit Registerkarten vorhanden sind. +1 für anders zu seinEine
awk
Lösung, die ziemlich portabel sein sollte und für eine beliebige Anzahl von Eingabedateien funktionieren sollte:quelle
paste-awk
und versuchte espaste file1 file2|paste-awk
und ich versuchte es,awk paste-awk file1 file2
aber keines funktionierte.awk: Line:1: (FILENAME=file1 FNR=1) Fatal: Division by zero
awk -f paste-awk file1 file2
sollte funktionieren, zumindest für GNU awk und mawk.paste
dass zwischen den beiden Zeilen weniger Platz ist. Und wenn die Eingabedatei nicht alle Zeilen gleich lang ist, führt dies zu einer rechtsbündigen Zeile-F\\t