So erkennen Sie den Unterschied zwischen Dateien

So erkennen Sie den Unterschied zwischen Dateien

Ich habe in den Stackoverflow-Communitys weitere ähnliche Links gefunden, die meine Frage jedoch nicht genau beantworteten.

Ich habe 2 Dateien mit unterschiedlicher Zeilenanzahl, ABER ich habe sie beide sortiert. Meine Originaldateien sind Hunderte von Zeilen lang, aber zur Fehlerbehebung habe ich Datei1 auf 12 Zeilen und Datei2 auf 5 Zeilen gesetzt. Datei2 ist eine Teilmenge von Datei1. Ich möchte einen Befehl ausführen, der alle Zeilen ausgibt, die in Datei1, aber nicht in Datei2 enthalten sind.

Ich habe versucht, die Unix-Befehle zu verwenden diff, commaber beide listen den vollständigen Inhalt von Datei1 auf, was ich nicht möchte.

Ein kurzes Beispiel hierfür wäre:

File1      File2
A           B
B           E
C           I
E           N
G           O
I
L
M
N
O
X

Hier können wir also sehen, dass alles, was in Datei2 ist, auch in Datei1 ist. Aus irgendeinem Grund zeigten beide den vollständigen Inhalt von Datei1. Ich nehme an, diffdas commliegt daran, dass ein zeilenweiser Vergleich durchgeführt wird und nicht die gesamte Datei durchsucht wird.

Gibt es einen anderen Unix-Befehl, den ich ausführen kann und der die erwartete Ausgabe liefert?

BEARBEITEN: Die Befehle, die ich verwendet habe, um das zu bekommen, was ich brauchte, waren:

a) Diff Datei1 Datei2

Dies listete im Wesentlichen alles aus Datei1 mit einem < davor auf, was anzeigte, dass der Inhalt aus Datei1 stammte, und alles aus Datei2 mit einem > davor. Definitiv nicht das, was ich brauchte

b) comm -23 Datei1 Datei2

Dies zeigte wieder den gesamten Inhalt von file1 und nicht den Diff, wie ich erwartet hatte. Ich habe auch

c) comm -3 Datei1 Datei2

Auf der Hilfeseite für comm stand, dass dies Zeilen in Datei 1, aber nicht in Datei 2 und umgekehrt ausdrucken würde. Aber auch das zeigte nicht, was ich wollte, denn in meinem Beispiel erscheint B in beiden Dateien, aber in unterschiedlichen Zeilen. Die Ausgabe denkt jedoch, dass es in der einen Datei steht, aber nicht in der anderen, und druckt es daher aus. Die Ausgabe sah also so aus:

A
B
    B
C
E
    E
etc.

Und es war nicht das, was ich erwartet hatte. Ich hatte erwartet

A
C
G
L
M
X

Antwort1

Dazu können Sie einfach den Inhalt der Datei B in Datei A umkehren, indem Sie ihn mit dem Grep-Befehl zurücksetzen.

Beispiel :

francois@zaphod:/tmp$
 cat > A
az
ae
ar
at
ay
au
francois@zaphod:/tmp$
 cat > b
ba
by
ay
at
au
francois@zaphod:/tmp$
  grep -v "$(cat /tmp/b)" /tmp/A
az
ae
ar
francois@zaphod:/tmp$

hier ist die Ausgabe nur die Zeile der Datei A, die in Datei B nicht vorhanden ist

Antwort2

Die Diff-Ausgabe zeigt, was getan werden muss, damit aus Datei X die Datei Y wird.

Deinem Kommentar zufolge könntest Du den folgenden Oneliner verwenden:

cat x y | sort -u  | cat y - | sort | uniq -u

Es wird

  1. Beide Dateien lesen
  2. Sortieren Sie sie neu und drucken Sie nur eindeutige Zeilen ( -ubeim Sortieren).
  3. Lesen Sie die Datei (y) und kombinieren Sie sie mit der weitergeleiteten Ausgabe
  4. Resort-Ausgabe
  5. Verwenden Sie uniq, damit nur einmal vorkommende Zeilen ( -uin unique) verwendet werden.

Diese Methode basiert auf der Mengenlehre. Zuerst addiert man zwei Mengen und subtrahiert dann eine davon.

Antwort3

Wenn eine der Dateien eine DOS-formatierte Textdatei ist, während die andere Datei eine Unix-formatierte Textdatei ist, dann unterscheidet sich jede Zeile von allen Zeilen in der anderen Datei, selbst wenn die Buchstaben in den Zeilen gleich sind. Dies liegt daran, dass in einer Datei am Ende jeder Zeile ein zusätzliches Wagenrücklaufzeichen vorhanden ist, das in der anderen Datei nicht vorhanden ist.

comm -3 file1 file2Wenn es file1sich um eine Unix-Textdatei und wenn file2es sich um eine DOS-Textdatei handelt, würde ich die folgende Ausgabe erwarten (das ist, was Sie haben):

A
B
        B
C
E
        E
G
I
        I
L
M
N
        N
O
        O
X

Ich würde die folgende Ausgabe erwarten, comm -3 file1 file2wenn es file1sich um eine DOS-Textdatei und wenn file2es sich um eine Unix-Textdatei handelt:

A
        B
B
C
        E
E
G
        I
I
L
M
        N
N
        O
O
X

Wenn beide Dateien die gleichen Zeilenenden haben, also beide DOS-Textdateien oder beide Unix-Textdateien sind, würde ich erwarten, dass die comm -3 file1 file2Ausgabe

A
C
G
L
M
X

Sie können beide Dateien mit dem Befehl in das Unix-Textformat konvertieren

dos2unix file1 file2

... vorausgesetzt, Sie haben das dos2unixDienstprogramm installiert.

verwandte Informationen