2012-05-07 2 views
0

Я ищу некоторый узор в 1.txt из 2.txt, используя «grep». Затем сделайте некоторые манипуляции. Однако, кажется, «grep» слишком медленный для большого текста.Альтернатива grep

for ((i=1; i<=236410; i++)) 
do 
    head -$i 1.txt|tail -1|grep -f - 2.txt|awk '{mul+=$4*$7} END {print $1,$2,$3,mul}' 
done > file1 

Мне просто интересно, какая альтернатива? Кажется awk/sed может это сделать, но просто не знаю, как труба переменной head -$i 1.txt|tail -1 в AWK или СЭД

ТНХ

+1

Ваш 'head' /' tail' комбо, что медленно. – tripleee

+0

Да, почему вы идете по одной линии за раз, а не ко всему этому? – Kevin

+0

Как я могу пройти мимо всего? – user815408

ответ

1

Предполагая, что ваш файл шаблона имеет 236,410 строк, и предполагая, grep может обрабатывать такое количество входных данных, и предполагая порядок выходного файла не имеет значения, почему бы не просто сделать

grep -f 1.txt 2.txt | awk ... >file1 

Если память является проблемой, и ваш вклад статические строки, попробуйте fgrep вместо; он может обрабатывать большее количество шаблонов. Если порядок вывода на самом деле значителен, что-то вроде этого должно быть намного быстрее;

while read line; do 
    grep "$line" 2.txt | awk ... 
done <1.txt >file1 

В зависимости от входных данных, вы можете сбросить с IFS и/или добавить некоторые опции в read обрабатывать пропуски, обратные косые и т.д.

Если вы хотите только 236,410 первые строки ввода, вы может изменить это на

head -n 236410 1.txt | 
while read line ... 

Если ни одно из вышеперечисленных вам не подходит, вот еще одна идея. Так как вы используете awk для реальной обработки, вы можете реорганизовать всю обработку в сценарий awk или создать сценарий sed на лету и передать результат этого на awk. Это усложнится, и опять же зависит от того, что ваши модели выглядеть, но что-то, как это должно дать вам идею:

sed 's%.*%/&/p%' 1.txt | less 

То, что вы смотрите на это sed скрипт, который печатает, если есть совпадение по каждому шаблонов в 1.txt. (Он будет разбит, если какой-либо шаблон содержит косую черту. В тривиальном случае используйте другой разделитель или удалите все слэши в шаблонах.) Теперь вы можете сохранить это в файле или (если ваш sed может обрабатывать скрипт на стандартный ввод) передать его второй экземпляр sed:

sed 's%.*%/&/p%' 1.txt | sed -f - -n 2.txt | less 

И это то, что вы передаете в awk:

sed 's%.*%/&/p%' 1.txt | sed -f - -n 2.txt | awk ... >file1 

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

  • Нет связанных вопросов^_^