Предполагая, что ваш файл шаблона имеет 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
Ваш 'head' /' tail' комбо, что медленно. – tripleee
Да, почему вы идете по одной линии за раз, а не ко всему этому? – Kevin
Как я могу пройти мимо всего? – user815408