2014-11-03 2 views
0

Ищу альтернативную команду для

grep ^GE "${TMPFILE2}" | wc -l

Есть шесть подобные команд в моем сценарии, которые ищут различные модели и хранящая подсчет результата в переменных.

Вышеупомянутая команда занимает много времени, чтобы найти шаблон^GE в TMPFILE2, так как размер файла большой

Есть ли способ, чтобы ускорить это с помощью Perl или AWK. Или любым способом Можем ли мы объединить эти шесть поисков в одном и ускорить это?

+0

Какие еще пять матчей? Вероятно, вы могли бы написать один awk-скрипт, чтобы сопоставить (и считать) все за один проход. –

ответ

2

Еще одна возможность

Просто для полноты картины, можно попытаться найти в параллель и посмотреть, насколько хорошо операционная система кэширует файлы!

#!/bin/bash 
grep -c "^ISA" file > isa.tmp & 
grep -c "^IEA" file > iea.tmp & 
grep -c "^ST" file > st.tmp & 
grep -c "^SE" file > se.tmp & 
grep -c "^GS" file > gs.tmp & 
grep -c "^GE" file > ge.tmp & 
wait 
isa=$(cat isa.tmp) 
iea=$(cat iea.tmp) 
st=$(cat st.tmp) 
se=$(cat se.tmp) 
gs=$(cat gs.tmp) 
ge=$(cat ge.tmp) 
echo $isa $iea $st $se $gs $ge 

Пересмотренные Ответ

Теперь, когда вы дали нам образцы поиска, могут быть и другие варианты:

#!/bin/bash 
grep -E "^(ISA|IEA|ST|SE|GS|GE)" file > tmp$$ 
isa_count=$(grep -c "^ISA" tmp$$) 
iea_count=$(grep -c "^IEA" tmp$$) 
st_count=$(grep -c "^ST" tmp$$) 
se_count=$(grep -c "^SE" tmp$$) 
se_count=$(grep -c "^GS" tmp$$) 
ge_count=$(grep -c "^GE" tmp$$) 
echo $isa_count $iea_count $st_count $se_count $ge_count 

Или это:

awk ' 
    /^ISA/ {isa++;next} 
    /^IEA/ {iea++;next} 
    /^ST/ {st++;next} 
    /^SE/ {se++;next} 
    /^GS/ {gs++;next} 
    /^GE/ {ge++;next} 
    END{ print isa,iea,st,se,gs,ge}' file 

Оригинальные Ответ

Да, сделать их все на одном дыхании с egrep:

egrep "pattern1|pattern2|pattern3..." file 

так:

egrep "pattern1|pattern2|pattern3..." file > tmp$$ 
grep -c pattern1 tmp$$ 
grep -c pattern2 tmp$$ 

Try держать поиск закрепленную в начале строки (с ^), если это возможно.

Примечание. Я считаю, что egrep устарел, и вместо этого мы должны использовать grep -E.

+1

Я бы также добавил параметр '-c' для grep, поэтому он возвращает количество строк, вместо использования' wc' – Hasturkun

+0

@Hasturkun Да, хорошая идея - спасибо. –

+0

Я думаю, что egrep обесценивается. –

0

Что-то, как это должно работать:

awk '/^ISA/ { ++isa_count } 
    /^ST/ { ++st_count } 
    /^GS/ { ++gs_count } 
    /^IEA/ { ++iea_count } 
    /^SE/ { ++se_count } 
    /^GE/ { ++ge_count } 
    END { print isa_count, st_count, gs_count, 
      iea_count, se_count, ge_count }' really_big_file.dat 

Вы можете даже сохранить awk программный код (вещи между одинарные кавычки) в отдельном файле, а затем сделать что-то вроде:

awk -f count_patterns.awk really_big_file.dat 

Тем не менее, это просто сбрасывает счета на ваш стандартный вывод. Для того, чтобы получить их в переменные в вашем сценарии оболочки, вы могли бы сделать что-то вроде этого:

read isa_count st_count gs_count iea_count se_count ge_count < <(awk .....) 

Преимущества этого подхода состоит в том, что он сканирует файл только один раз, чтобы произвести все подсчеты.

Редактировать: обновлено, чтобы использовать фактические примеры шаблонов из вашего ответа.

+0

Спасибо за ответ. Я попробовал запустить вашу команду как время awk '/^SE/{++ counter1}/^ GE/{++ counter2} END {print counter1, counter2}' 10047_RP_2014070218075858_00001_5010.txt. это занимает 21 секунду, в то время как отдельные графы для двух паттернов принимают 10.40 секунд каждый. Похоже, что никакого существенного улучшения в отношении времени. Я ищу вариант производительности. –

+0

Можете ли вы подробно указать, как хранить отдельные значения в переменных? –

+0

Просто замените '.....' на остальную часть командной строки из более ранних примеров - либо на то, что вы явно указываете программу, либо на ту, где вы поместили программу в файл. – twalberg

Смежные вопросы