Как использовать grep с шаблонами в файле и получить количество вхождений каждого шаблона?

Как использовать grep с шаблонами в файле и получить количество вхождений каждого шаблона?

Я пытаюсь выяснить, как использовать grep с шаблонами в fileA.txt и искать их в fileB.tab. Результат, который я хочу получить, — это количество вхождений каждого шаблона в fileB.tab.

Я пытался:

grep -f FileA.txt FileB.tab | wc -l

Но я думаю, что это возвращает мне все строки в FileB.tab, где появляется шаблон fileA.tab.

решение1

Если patternsфайл содержит только фиксированные строки, при gnuнастройке вы можете сделать следующее:

grep -oFf patterns infile | sort | uniq -c

Если содержимое — это регулярное выражение, то может быть что-то вроде

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

то есть использовать ту же grepкоманду, только на этот раз обработать результат так, sedчтобы заменить совпадения фактическим шаблоном (с помощью другого sedскрипта, основанного на содержимом patterns)

решение2

uniq имеет возможность подсчитывать вхождения

grep -f fileA.txt fileB.txt | uniq -c

Однако имейте в виду, что если в вашем fileA есть дубликаты, подсчет будет неверным, так как grep будет выполняться несколько раз. В этом случае сначала пропустите fileA через uniq, чтобы удалить дубликаты, а затем используйте его для шаблонов.

Вы можете отфильтровать его в новый файл или обработать файл построчно и запустить его оттуда.

while read keyword; do grep $keyword fileB.txt; done < fileA.txt | uniq -c

Связанный контент