Ich habe eine CSV-Datei mit vielen Zeilen und muss einige Übereinstimmungen finden und in eine Datei ausgeben. Meine Daten sehen so aus:
Datei 1
qwerty
asdfgh
zxcvbn
qwerty
aassdd
zzxxcc
yyuuii
tttttt
Ich muss Folgendes abgleichen:
Datei 2
qwert
tttttt
aassdd.
Da meine Datei groß und meine Liste zum Abgleichen lang ist, mache ich Folgendes:
while read n ; do grep $n File_1.csv >> results.csv ; done < File_2.csv
Ich kann nicht das gewünschte Ergebnis erzielen.
Antwort1
Sie müssen keine Schleife ausführen. Die -f
Option nimmt eine Datei mit den zu suchenden Mustern:
grep -Ff File_2.csv File_1.csv > results.csv
Ich habe auch die -F
Option hinzugefügt, dass die Suchbegriffe wörtlich und nicht als reguläre Ausdrücke behandelt werden.
Antwort2
Wenn keine der Dateien Duplikate enthält, können Sie Folgendes tun:
# In file_1 and file_2
sort file_1 file_2 | uniq -d
# In file_1 or file_2 but not both
sort file_1 file_2 | uniq -u
# In file_1 and not file_2
sort file_1 file_2 | uniq -d | sort - file_1 | uniq -u
# In file_2 and not file_1
sort file_1 file_2 | uniq -d | sort - file_2 | uniq -u
Antwort3
Das grep
Dienstprogramm kann Muster aus einer Datei lesen und sie mit dem Inhalt einer anderen Datei vergleichen. Es ist keine Schleife in der Shell erforderlich.
$ grep -f patterns file
Unter Verwendung der beiden Dateien, die Sie in Ihrer Frage haben (Datei 1 ist, file
während Datei 2 ist patterns
), ergibt dies
qwerty
qwerty
tttttt
Um eine Übereinstimmung mit den Mustern aus patterns
festen Zeichenfolgen (nicht regulären Ausdrücken) zu erzielen, fügen Sie Folgendes hinzu -F
:
$ grep -F -f patterns file
Für das angegebene Beispiel ergibt sich das gleiche Ergebnis wie ohne -F
.
Um die Übereinstimmung über ganze Zeilen hinweg zu erzwingen, fügen Sie Folgendes hinzu -x
:
$ grep -x -F -f patterns file
tttttt
Da qwerty
keine qwert
vollständige Übereinstimmung vorliegt, werden diese Zeilen nicht zurückgegeben.