Можно ли определить, сколько раз определенное слово появляется в нескольких файлах - файл за файлом - с помощью grep
опция «-c», но она возвращает количество совпадающих строк, в которых встречается конкретное слово, и не будет работать, поскольку строка может содержать несколько экземпляров слова
Например :
Файл A.txt: около 12345 слов и риск и риск
Файл B.txt: и 12345 тогда еще один риск
Файл C.txt: пустые слова
Я бы побежал grep -l "12345" *.txt | xargs grep ?????? risk -
Ожидаемый результат
А.txt:2
B.txt:1
ripgrep изначально поддерживает эту функциональность:
$ rg --count-matches -w risk *.txt
B.txt:1
A.txt:2
В противном случае напишите сценарий bash в следующем духе:
for f in *.txt
do
echo "$f:$(grep -w risk "$f" | tr ' ' '\n' | grep -cw risk)"
done
с примером запуска:
A.txt:2
B.txt:1
Что-то вроде этого будет считать слова
awk -v w=risk '{for(i=1;i<=NF;i++)if ($i==w)f[FILENAME]++} END {for(n in f)print n,f[n]}' A.txt B.txt
A.txt 2
B.txt 1
В GNU awk для многосимвольных RS
, ENDFILE
и \s
сокращений для [[:space:]]
:
$ awk -v RS='\\s+' -v word='risk' '$0==word{cnt++} ENDFILE{if (cnt) print FILENAME, cnt; cnt=0}' {A,B,C}.txt
A.txt 2
B.txt 1
Если хотите, вы можете легко преобразовать это для подсчета вхождений всех слов в каждом файле:
$ awk -v RS='\\s+' '{cnt[$0]++} ENDFILE{for (word in cnt) print FILENAME, word, cnt[word]; delete cnt}' {A,B,C}.txt
A.txt some 1
A.txt words 1
A.txt risk 2
A.txt and 2
A.txt 12345 1
B.txt risk 1
B.txt another 1
B.txt and 1
B.txt then 1
B.txt 12345 1
C.txt words 1
C.txt dummy 1
вам нужны все вхождения
risk
или только те, которые встречаются в строках, содержащих12345
?