Wie können 2 unsortierte Textdateien unterschiedlicher Länge nebeneinander (in Spalten) in a angezeigt werden?shell
Gegeben one.txt
und two.txt
:
$ cat one.txt
apple
pear
longer line than the last two
last line
$ cat two.txt
The quick brown fox..
foo
bar
linux
skipped a line
Anzeige:
apple The quick brown fox..
pear foo
longer line than the last two bar
last line linux
skipped a line
paste one.txt two.txt
macht fast den Trick, richtet die Spalten aber nicht gut aus, da nur eine Registerkarte zwischen Spalte 1 und 2 gedruckt wird. Ich weiß, wie das mit Emacs und Vim geht, möchte aber, dass die angezeigte Ausgabe für Piping ect stdout angezeigt wird.
Die Lösung, die ich mir ausgedacht habe, verwendet sdiff
und leitet dann zu sed, um die Ausgabe zu entfernen sdiff
.
sdiff one.txt two.txt | sed -r 's/[<>|]//;s/(\t){3}//'
Ich könnte eine Funktion erstellen und in meine stecken, .bashrc
aber sicherlich gibt es bereits einen Befehl dafür (oder möglicherweise eine sauberere Lösung)?
linux
shell
unix
command-line
gnu-coreutils
Chris Seymour
quelle
quelle
Antworten:
Sie können
pr
dies verwenden, indem Sie das-m
Flag verwenden, um die Dateien zusammenzuführen, eine pro Spalte, und-t
um Überschriften wegzulassen, z.Ausgänge:
Siehe auch:
quelle
pr
hatte. Ich habe es mit 3 Dateien versucht und die Ausgabe wurde abgeschnitten, aber die-w
Option hat das gelöst. Gute Antwort.$COLUMNS
, was von der Shell bereitgestellt werden sollte.pr
das Ende langer Zeilen abgeschnitten. Gibt es eine Möglichkeit, die Zeilen zu umbrechen?Um die Antwort von @Hasturkun ein wenig zu erweitern : Standardmäßig
pr
werden nur 72 Spalten für die Ausgabe verwendet, aber es ist relativ einfach, alle verfügbaren Spalten Ihres Terminalfensters zu verwenden:Die meisten Shells speichern (und aktualisieren) die Bildschirmbreite Ihres Terminals in der
$COLUMNS
Umgebungsvariablen. Daher geben wir diesen Wert nur anpr
die Breite der Ausgabe weiter.Dies beantwortet auch die Frage von @Matt :
Also, nein:
pr
selbst kann die Bildschirmbreite nicht erkennen, aber wir helfen ein bisschen, indem wir die Breite des Terminals über die-w
Option übergeben.quelle
Wenn Sie wissen, dass die Eingabedateien keine Registerkarten haben,
expand
vereinfacht die Verwendung von @oyss die Antwort :Wenn die Eingabedateien Registerkarten enthalten könnten, können Sie diese immer zuerst erweitern:
quelle
Durch die Verwendung
*
in einer Formatspezifikation können Sie die Feldlänge dynamisch angeben.quelle
diff -y one.txt two.txt
eine bessere Arbeit alspaste one.txt two.txt
und Entfernen diffs zusätzliche Zeichen , die angezeigt werden mitsed
trivial ist mit dem Schreiben zu vergleichen / eine Erinnerungawk
Skript. Auch mit beiden als Funktionen.bash_rc
länger! = Besser, lesbarer, schneller .. was ist hier der Vorteil?Wenn Sie die dynamische Feldlängenzählung aus Barmars Antwort entfernen, wird der Befehl viel kürzer. Sie benötigen jedoch noch mindestens ein Skript, um die Arbeit abzuschließen, die unabhängig von der gewählten Methode nicht vermieden werden konnte.
quelle
Wenn Sie den tatsächlichen Unterschied zwischen zwei Dateien nebeneinander ermitteln möchten, verwenden Sie
diff -y
:Sie können auch eine Ausgabebreite mit der folgenden
-W, --width=NUM
Option festlegen :und um
diff
die Spaltenausgabe an Ihr aktuelles Terminalfenster anzupassen:quelle
Es gibt einen
sed
Weg:Unter Bashkönnten Sie verwenden
printf -v
:(Natürlich
pr
ist die Lösung von @Hasturkun die genaueste !) :Vorteil von
sed
überpr
Sie können die Trennbreite und / oder Trennzeichen fein wählen:
Oder zum Beispiel, um Linien zu markieren, die Folgendes enthalten
line
:wird rendern:
quelle
Nachfolgend finden Sie eine Python-basierte Lösung.
Beispiel
quelle
quelle
sdiff
ist das,diff -y
was ich in der Frage diskutiere.diff
Zeichen zwischen den beiden Dateien hinzugefügt.