Eu ignoraria grep
para este. É bom para expressões regulares, mas não parece que você realmente precise disso aqui. comm
pode comparar dois arquivos e mostrar interseções. Usando seus exemplos exatos:
$ comm -12 list.txt output.txt
a.1
b.1
etc
Isso é mais rápido do que qualquer grep, mas depende (strongmente) dos arquivos que estão sendo classificados. Se não estiverem, você pode classificá-los previamente, mas isso alterará a saída para que ela seja classificada também.
comm -12 <(sort list.txt) <(sort output.txt)
Como alternativa, esta resposta de O iiSeymour permite que você faça isso com grep
. Os sinalizadores solicitam um arquivo de entrada e forçam uma pesquisa de palavra completa com cadeia fixa. Isso não depende da ordem, mas será baseado na ordem output.txt
. Inverta os arquivos se você os quiser na ordem do list.txt.
$ grep -wFf list.txt output.txt
a.1
b.1
etc
Se o seu list.txt
é realmente grande, você pode ter que lidar com isso de forma mais iterativa e passar cada linha para o grep separadamente. Isso aumentará maciçamente o tempo de processamento. Acima você estaria lendo output.txt
uma vez, mas desta forma você leu e processou para cada linha list.txt. É horrível ... Mas pode ser sua única escolha. No lado positivo, ele classifica as coisas pela ordem list.txt
.
$ while read line; do grep -wF "$line" output.txt; done < list.txt
a.1
b.1
etc