2017-01-11 4 views
1

Я пытаюсь сканировать файл (test.txt), что-то вроде этого:Подсчет количества времени каждого шаблона в файле отображается в отдельном файле

make 
bake 
baker 
makes 
take 
cook 
sbake 

для моделей, перечисленных в отдельном файле (ref.txt):

ake 
make 
bake 
look 

Я попытался зацикливание с Grep следующим образом:

Однако, это не в счет частичных совпадений о олько точные совпадения (или непоследовательны в подсчете частичных совпадений) и I выход:

4 
1 
2 
0 

вместо

6 
2 
3 
0 

Спасибо за любую помощь!

+1

извините, отредактировано выше, поэтому должно быть правильно сейчас – Ash

+1

Я не могу воспроизвести это. Для меня он правильно возвращает 6 2 3 0. – fedorqui

+0

То же самое здесь, не может быть воспроизведено на 'grep (GNU grep) 2.26' – Inian

ответ

0
$ while read -r line; do grep -c $line test.txt ; done < ref.txt 
6 
2 
3 
0 
1

См why-is-using-a-shell-loop-to-process-text-considered-bad-practice для некоторых, но не все из причин, чтобы не попробовать сделать это с петлей оболочки.

Стандартный инструмент UNIX для работы с текстом является AWK:

$ awk 'NR==FNR{cnt[$0]=0;next} {for (re in cnt) cnt[re]+=gsub(re,"&")} END{for (re in cnt) print re, cnt[re]}' ref.txt test.txt 
ake 6 
bake 3 
look 0 
make 2 

выше предполагает, что текст в файле ref.txt не содержит метасимволы или регулярных выражений, если это произойдет, то совпадение регулярных выражений желательно. Если это возможно, но вам нужна строка вместо соответствия регулярному выражению, вам нужно немного другое решение.