
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 9
nur 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.txt
ist die horizontale und v.txt
wo 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 printf
ein Header zum Interpretieren comm
der Ausgabe von – mit Angabe der angeforderten Dateinamen – dann wird es comm
auf der sortierten Eingabe ausgeführt, wobei Zeilen unterdrückt werden, die in beiden Dateien vorhanden sind ( -3
). Die beiden Eingaben für comm
sind Prozesssubstitutionen, bei denen ich don_crisstis tr
Vorschlag verwende, Leerzeichen in in Zeilenumbrüche umzuwandeln File1
; dann werden beide Dateien durchgeleitet sort
, was comm
erfordert.
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