Wie verwende ich grep mit Mustern in einer Datei und erhalte die Anzahl der Vorkommen jedes Musters?

Wie verwende ich grep mit Mustern in einer Datei und erhalte die Anzahl der Vorkommen jedes Musters?

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 patternsDatei nur feste Zeichenfolgen enthält, gnukö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 grepBefehl, nur verarbeiten Sie dieses Mal das Ergebnis mit , sedum die Übereinstimmungen durch das tatsächliche Muster zu ersetzen (über ein anderes sedSkript 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

verwandte Informationen