Важное редактирование
Если подумать, не используйте grep с перенаправлением, так как это невероятно медленно. Используйте awk, чтобы прочитать исходные шаблоны для возврата заказа.
Используйте это вместо
grep -f patterns searchdata | awk 'NR==FNR { line[$1] = $0; next } $1 in line { print line[$1] }' - patterns > matched
Контрольный показатель
#!/bin/bash
paste <(shuf -i 1-10000) <(crunch 4 4 2>/dev/null | shuf -n 10000) > searchdata
shuf -i 1-10000 > patterns
printf 'Testing awk:'
time grep -f patterns searchdata | awk 'NR==FNR { line[$1] = $0; next } $1 in line { print line[$1] }' - patterns > matched
wc -l matched
cat /dev/null > matched
printf '\nTesting grep with redirection:'
time {
while read -r pat; do
grep -w "$pat" searchdata >> matched
done < patterns
}
wc -l matched
Вывод
Testing awk:
real 0m0.022s
user 0m0.017s
sys 0m0.010s
10000 matched
Testing grep with redirection:
real 0m36.370s
user 0m28.761s
sys 0m7.909s
10000 matched
Оригинал
Чтобы сохранить порядок запросов, прочитайте файл построчно -line:
while read -r pat; do grep -w "$pat" file2.txt; done < file1.txt
Я не думаю, что у grep есть возможность поддержать это, но это решение будет медленнее, если у вас есть большие файлы для чтения.