Как получить вывод порядка запроса, когда мы используем grep? - PullRequest
1 голос
/ 24 января 2020

У меня есть 2 файла file1.txt

1
3
5
2

File2.txt

1 aaa
2 bbb
3 ccc
4 aaa
5 bbb

Желаемый вывод:

1 aaa
3 ccc
5 bbb
2 bbb

Используемая команда: cat File1.txt |grep -wf- File2.txt, но вывод был:

1 aaa
2 bbb
3 ccc
5 bbb

Это способ вернуть вывод в порядке запроса? Заранее спасибо !!!

1 Ответ

0 голосов
/ 24 января 2020

Важное редактирование

Если подумать, не используйте 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 есть возможность поддержать это, но это решение будет медленнее, если у вас есть большие файлы для чтения.

...