
Я пытаюсь выяснить, как использовать 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