
Ich versuche herauszufinden, wie ich grep mit den Mustern in fileA.txt verwenden und in fileB.tab danach suchen kann. Das gewünschte Ergebnis ist die Anzahl der Vorkommen jedes Musters in fileB.tab.
Ich habe versucht:
grep -f FileA.txt FileB.tab | wc -l
Ich glaube aber, dass mir dadurch alle Zeilen in FileB.tab zurückgegeben werden, in denen ein FileA.tab-Muster vorkommt.
Antwort1
Wenn die patterns
Datei nur feste Zeichenfolgen enthält, gnu
können Sie in einem Setup Folgendes tun:
grep -oFf patterns infile | sort | uniq -c
Wenn der Inhalt ein regulärer Ausdruck ist, dann vielleicht etwas wie
sed -E 'h;s|/|\\&|g;x;s|[\&/]|\\&|g;H;x;s|(.*)\n(.*)|s/\1/\2/|' patterns \
| sed -f - <(grep -of patterns infile) | sort | uniq -c
d. h., verwenden Sie denselben grep
Befehl, nur verarbeiten Sie dieses Mal das Ergebnis mit , sed
um die Übereinstimmungen durch das tatsächliche Muster zu ersetzen (über ein anderes sed
Skript basierend auf dem Inhalt von patterns
).
Antwort2
uniq hat eine Option zum Zählen der Vorkommen
grep -f fileA.txt fileB.txt | uniq -c
Bedenken Sie jedoch, dass die Anzahl nicht korrekt ist, wenn Ihre Datei A Duplikate enthält, da sie mehrmals gesucht wird. Führen Sie in diesem Fall Datei A zuerst durch Uniq, um Duplikate zu entfernen, und verwenden Sie es dann für die Muster.
Sie können es in eine neue Datei filtern oder die Datei zeilenweise verarbeiten und von dort aus ausführen.
while read keyword; do grep $keyword fileB.txt; done < fileA.txt | uniq -c