2012-08-03 2 views
1

Я пытаюсь написать сценарий оболочки, который будет искать регулярное выражение в каждом из файлов в текущем каталоге, не используя временные файлы.Найти частоту выражения во всех файлах каталога

Первоначально, я сделал это, используя временный файл для хранения echo * | sed 's/ /\n/g', а затем процитировал каждую строку этого файла, используя cat на каждом, а затем grepping мое выражение и подсчет строк вывода. У меня возникли проблемы с поиском временных файлов, и мне было интересно, могу ли я делать все с использованием переменных или некоторых методов, отличных от временных файлов (я тоже не хочу создавать отдельный каталог для файлов temp).

Проблема, с которой я столкнулась с переменными, заключалась в том, что после того, как я установил значение переменной на вывод echo * | sed 's/ /\n/g', я не знал, как пройти через каждую строку, чтобы я мог получить количество выражений из файлов.

Я просто хочу следующую работу (где я жёстко выражение):

% ls 
% file1 file2 file3 
% ./countMost.sh 
% file2(28) 
% ls 
% file1 file2 file3 

означающий, что file2 имеет большинство случаев выражения (28 из них).

ответ

2

Вы можете попробовать что-то вроде этого:

grep -c regex files | sed -e 's/^\(.*\):\(.*\)$/\2 \1/' | sort -r -n | head -n 1 

Где regex ваше регулярное выражение (можно использовать egrep, а) и files ваш список файлов.

Учитывая 3 файла:

file1: 
qwe 
qwe 
qwe 
asd 
zxc 

file2: 
qwe 
asd 
zxc 

file3: 
asd 
qwe 
qwe 
qwe 
qwe 

и я бегу:

grep -c 'qwe' file[1-3] | sed -e 's/^\(.*\):\(.*\)$/\2 \1/' | sort -r -n 

Я получаю результат:

4 file3 
3 file1 
1 file2 

Кроме того, добавление | head -n 1 только в конце дает мне:

4 file3 
1

Аналогичный вариант решения Работа Lin использует своего рода арг вместо СЭД:

grep -c -e "^d" file* | sort -n -k2 -t: -r |head -1 

(здесь я смотрю на строки, начинающиеся с «D»)

0

Это должно дать вам десятку самых общие строчные слова (вы меняете изменение регулярного выражения на что угодно) для файлов сгустка внутри dir, называемого test with counts.

grep -rhoE "[a-z]+" test | sort | uniq -c | sort -r | head 
     3 test 
     2 wow 
     2 what 
     2 oh 
     2 foo 
     2 bar 
     1 ham 

Если вы хотите, чтобы счетчик на имя файла, а затем снимите флаг ч на Grep

grep -roE "[a-z]+" test | sort | uniq -c | sort -r | head 
     3 test/2:test 
     1 test/2:wow 
     1 test/2:what 
     1 test/2:oh 
     1 test/2:foo 
     1 test/2:bar 
     1 test/1:wow 
     1 test/1:what 
     1 test/1:oh 
     1 test/1:ham 
Смежные вопросы