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
, c
und e
. Gemeinsame Zeilen sind 2
, 4
und 5
. Zeile 4
hat 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 cut
Folgendes:cut -d','
<( ... )
comm -1 -3 file1 file2
Für Datei2 eindeutige Zeilen drucken.
Vorbehalte:
cut
wird Probleme haben, wenn das Trennzeichen als Zeichen in einem Feld vorkommen kann.
Zum Beispiel:
"field1","field2,stillfield2","field3"
cut
wird 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 diff
allerdings comm
nicht viel, wenn die Zeilenstruktur in den Dateien nicht identisch ist.
Antwort3
Abgesehen von der comm
und -Lösung, die Sie hierfür diff
verwenden 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 )