Vergleichen Sie zwei Dateiinhalte horizontal und vertikal

Vergleichen Sie zwei Dateiinhalte horizontal und vertikal

Ich habe zwei Dateien:

Datei1 hat den folgenden Inhalt:

1 2 3 4 5 6 7 8 10

Datei2 hat den folgenden Inhalt:

1
2
3
4
5
6
7
8
9
10

Wie kann ich den Unterschied zwischen zwei Dateien finden und die ungerade Zahl ausdrucken und auch sagen, aus welcher Datei sie stammt.

In diesem Fall erscheint beispielsweise 9nur in File2. Wie kann ich also einen Befehl ausführen und eine Ausgabe in der Art von erhalten?

9 is only in File2

Antwort1

Wenn Sie eine saubere Formatierung haben (Leerzeichen x Zeilenumbruch), ist es am einfachsten, die Zeile in Zeilen umzuwandeln und sie dann wie folgt zu differenzieren:

diff <( sed -e "s/ /\n/g" h.txt ) v.txt

Wo h.txtist die horizontale und v.txtwo die vertikale Datei?

Antwort2

Möglicherweise möchten Sie (G)AWK verwenden:

Um Unterschiede zu finden, verwenden Sie AWK, um file1.txt zunächst in eine zeilenweise Darstellung umzuwandeln, und leiten Sie das Ergebnis dann in diff weiter:

gawk 'BEGIN {FS = " "} ; {for(i=1; i<=NF; i++) print $i}' file1.txt | diff file2.txt - 

Antwort3

Es gibt mehrere Möglichkeiten, dies zu tun. Hier ist sie comm.

Zuerst printfein Header zum Interpretieren commder Ausgabe von – mit Angabe der angeforderten Dateinamen – dann wird es commauf der sortierten Eingabe ausgeführt, wobei Zeilen unterdrückt werden, die in beiden Dateien vorhanden sind ( -3). Die beiden Eingaben für commsind Prozesssubstitutionen, bei denen ich don_crisstis trVorschlag verwende, Leerzeichen in in Zeilenumbrüche umzuwandeln File1; dann werden beide Dateien durchgeleitet sort, was commerfordert.

printf "File1\tFile2\n"; comm -3  <(tr ' ' '\n' < File1 | sort)  <(sort File2)

Beispiellauf

Eingabedatei1:

1 2 3 4 5 6 7 8 10 11

Eingabedatei2:

1
2
3
4
5
6
7
8
9
10

Ausgabe:

$ printf "File1\tFile2\n"; comm -3 <(sed 's/ /\n/g' File1 |sort ) <(sort File2)
File1   File2
11
        9

verwandte Informationen