Vergleichen Sie zwei Flatfiles A und B, um zu sehen, ob alle Datensätze in B auch in A vorhanden sind.

Vergleichen Sie zwei Flatfiles A und B, um zu sehen, ob alle Datensätze in B auch in A vorhanden sind.

Ich habe zwei Flatfiles A und B. A ist eine große Datei mit Millionen von Datensätzen und B soll eine Teilmenge von A sein. A hat 20 Spalten mit einem eindeutigen Schlüssel und B hat 5 Spalten mit demselben eindeutigen Schlüssel. Können Sie mir bitte erklären, wie ich B mit A vergleichen und herausfinden kann, ob die in Datei B vorhandenen Datensätze auch in Datei A vorhanden sind und in den jeweiligen Spalten dieselben Daten enthalten.

Antwort1

Ich habe zwei Dateien erstellt, um meine Befehle zu demonstrieren

file1:

1 a1 b1 c1 d1 e1
2 a2 b2 c2 d2 e2
3 a3 b3 c3 d3 e3
4 a4 b4 c4 d4 e4
5 a5 b5 c5 d5 e5

file2:

2 b2 c2 e2
4 b4 c4 xx
5 b5 c5 e5

Die erste Spalte ist der eindeutige Schlüssel. Die gemeinsamen Spalten sind Spalte b, cund e. Gemeinsame Zeilen sind 2, 4und 5. Zeile 4hat in Spalte einen anderen Wert e.

Hier ist der Befehl mit Ausgabe:

$ comm -1 -3 <(cut -d' ' -f1,3,4,6 file1) file2
4 b4 c4 xx

Wenn die Dateien noch nicht sortiert sind, können Sie es folgendermaßen tun:

$ comm -1 -3 <(cut -d' ' -f1,3,4,6 file1 | sort) <(sort file2)

Erläuterung:

cut -d' ' -f1,3,4,6 file1

Drucken Sie die Felder 1, 3, 4 und 6 aus der Datei. Die Felder sind durch Leerzeichen getrennt. Wenn die Felder durch Kommas getrennt sind, verwenden Sie cutFolgendes:cut -d','

<( ... )

Prozesssubstitution

comm -1 -3 file1 file2

Für Datei2 eindeutige Zeilen drucken.

Vorbehalte:

cutwird Probleme haben, wenn das Trennzeichen als Zeichen in einem Feld vorkommen kann.

Zum Beispiel:

"field1","field2,stillfield2","field3"

cutwird nicht verstehen, dass das Komma in "field2,stillfield2"Teil des Feldes ist.

Wenn Ihre Dateien so sind, ist es vielleicht besser, eine Programmiersprache mit integrierter CSV-Verarbeitung zu verwenden. Zum BeispielPython.

Antwort2

Wenn die Dateien wie gesagt unterschiedliche Spalten haben, ist es wahrscheinlich am einfachsten, ein kleines Programm in einer Sprache Ihrer Wahl zu schreiben. Das hilft diffallerdings commnicht viel, wenn die Zeilenstruktur in den Dateien nicht identisch ist.

Antwort3

Abgesehen von der commund -Lösung, die Sie hierfür diffverwenden könnten . Angenommen, Ihre relevanten Daten sind die Spalten 1, 3 und 10 in Datei A und 1, 2 und 3 in Datei B. Wir verwenden, um die Spalten aus A auszuwählen, verwenden diese als Schlüsselwortübereinstimmungsdatei und überprüfen ihr Vorhandensein in Datei B umgekehrt. Wenn Datei B eine Zeile enthält, die in den aus Datei A extrahierten übereinstimmenden Zeilen nicht vorhanden ist, werden sie angezeigt. Wenn alle übereinstimmen, gibt es keine Ausgabe (da B vermutlich eine Teilmenge von A ist).grep
cut

grep -wvf <( cut -f1,3,10 fileA ) fileB

Oder wenn Datei B mehr als drei Spalten hat:

grep -wvf <( cut -f1,3,10 fileA ) <( cut -f1,2,3 fileB )

verwandte Informationen