Frage Zeigen Sie zwei Dateien nebeneinander an


Wie können 2 unsortierte Textdateien unterschiedlicher Länge nebeneinander angezeigt werden? (in Spalten) in einem 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, aber richtet die Spalten nicht gut aus, da nur eine Registerkarte zwischen Spalte 1 und 2 gedruckt wird. Ich weiß, wie das mit Emacs und Vim, aber die Ausgabe angezeigt werden soll, um Pipettieren ect.

Die Lösung, die ich mir ausgedacht habe, verwendet sdiff und dann Rohre zu sed, um die Ausgabe zu entfernen sdiff fügt hinzu.

sdiff one.txt two.txt | sed -r 's/[<>|]//;s/(\t){3}//'

Ich könnte eine Funktion erstellen und sie in meine einfügen .bashrc aber sicher existiert schon ein Befehl dafür (oder a Reiniger Lösung potenziell)?


75
2017-11-12 10:15


Ursprung


Antworten:


Sie können verwenden pr um dies zu tun, mit der -m Flag zum Zusammenführen der Dateien, eine pro Spalte und -t Kopfzeilen weglassen, z.

pr -m -t one.txt two.txt

Ausgänge:

apple                               The quick brown fox..
pear                                foo
longer line than the last two       bar
last line                           linux

                                    skipped a line

134
2017-11-12 12:44



Etwas erweitern @HasturkunAntwort: standardmäßig pr verwendet für seine Ausgabe nur 72 Spalten, aber es ist relativ einfach, alle verfügbaren Spalten Ihres Terminalfensters zu verwenden:

pr -w $COLUMNS -m -t one.txt two.txt

Die meisten Shells werden gespeichert (und aktualisieren) Die Bildschirmbreite Ihres Terminals in der $COLUMNS Umgebungsvariable, also geben wir diesen Wert nur an pr für die Einstellung der Breite der Ausgabe zu verwenden.

Dies beantwortet auch @Mattdie Frage:

Gibt es eine Möglichkeit, die Bildschirmbreite automatisch zu erkennen?

Also, nein: pr selbst kann die Bildschirmbreite nicht erkennen, aber wir helfen ein wenig, indem wir die Breite des Terminals über die -w Möglichkeit.


24
2018-05-08 13:40



paste one.txt two.txt | awk -F'\t' '{
    if (length($1)>max1) {max1=length($1)};
    col1[NR] = $1; col2[NR] = $2 }
    END {for (i = 1; i<=NR; i++) {printf ("%-*s     %s\n", max1, col1[i], col2[i])}
}'

Verwenden * In einer Formatangabe können Sie die Feldlänge dynamisch angeben.


6
2017-11-12 10:47



Wenn Sie wissen, dass die Eingabedateien keine Registerkarten haben, verwenden Sie expand vereinfacht @oussist es Antworten:

paste one.txt two.txt | expand --tabs=50

Wenn Tabs in den Eingabedateien vorhanden sein könnten, können Sie immer zuerst expandieren:

paste <(expand one.txt) <(expand two.txt) | expand --tabs=50

4
2017-08-25 06:11



Entfernen Sie dynamisch Feldlänge Zählen von Barmar Antwort wird es eine viel kürzere Befehl machen .... aber Sie brauchen immer noch mindestens ein Skript, um die Arbeit zu beenden, die nicht vermieden werden konnte, egal, welche Methode Sie wählen.

paste one.txt two.txt |awk -F'\t' '{printf("%-50s %s\n",$1,$2)}'

2
2017-11-12 12:17



Da ist ein sed Weg:

f1width=$(wc -L <one.txt)
f1blank="$(printf "%${f1width}s" "")"
paste one.txt two.txt |
    sed "
        s/^\(.*\)\t/\1$f1blank\t/;
        s/^\(.\{$f1width\}\) *\t/\1 /;
    "

(Natürlich @Hasturkuns Lösung pr ist der meistens richtig!):


1
2018-01-04 14:43



Wenn Sie den tatsächlichen Unterschied zwischen zwei Dateien wissen möchten, verwenden Sie den folgenden Befehl

diff -y file1.cf file2.cf

Sie können auch die Breite für das Drucken von Spalten mit der Taste einstellen -W, --width=NUM Möglichkeit:

diff -y -W 150 file1.cf file2.cf

1
2018-01-12 10:12



diff -y <file1> <file2>


[root /]# cat /one.txt
Apfel
Birne
längere Linie als die letzten beiden
letzte Linie
[root /]# cat /two.txt
Der schnelle braune Fuchs..
foo
Bar
Linux
[root@RHEL6-64 /]# diff -y one.txt two.txt
Apfel | Der schnelle braune Fuchs..
Birne | foo
längere Linie als die letzten beiden | Bar
letzte Zeile | Linux

0
2018-01-01 11:49



Finden Sie unten eine Python-basierte Lösung.

import sys

# Specify the number of spaces between the columns
S = 4

# Read the first file
l0 = open( sys.argv[1] ).read().split('\n')

# Read the second file
l1 = open( sys.argv[2] ).read().split('\n')

# Find the length of the longest line of the first file
n = len(max(l0, key=len))

# Print the lines
for i in  xrange( max( len(l0), len(l1) ) ):

    try:
        print l0[i] + ' '*( n - len(l0[i]) + S) + l1[i]
    except:
        try:
            print ' ' + ' '*( n - 1 + S) + l1[i]
        except:
            print l0[i]

Beispiel

apple                            The quick brown fox..
pear                             foo
longer line than the last two    bar 
last line                        linux

                                 skipped a line

0
2018-01-29 15:01