While-Read-Schleife mit grep

While-Read-Schleife mit grep

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 -fOption nimmt eine Datei mit den zu suchenden Mustern:

grep -Ff File_2.csv File_1.csv > results.csv

Ich habe auch die -FOption 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 grepDienstprogramm 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, filewährend Datei 2 ist patterns), ergibt dies

qwerty 
qwerty 
tttttt 

Um eine Übereinstimmung mit den Mustern aus patternsfesten 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 qwertykeine qwertvollständige Übereinstimmung vorliegt, werden diese Zeilen nicht zurückgegeben.

verwandte Informationen