Eu ignoraria grep
por 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 muito dos arquivos que estão sendo classificados. Se não estiverem, você pode pré-classificá-las, mas isso alterará a saída para que também seja classificada.
comm -12 <(sort list.txt) <(sort output.txt)
Como alternativa, esta resposta do iiSeymour permitirá que você faça isso grep
. Os sinalizadores solicitam um arquivo de entrada e forçam uma pesquisa por palavra-chave de cadeia fixa. Isso não depende do pedido, mas será baseado no output.txt
pedido. Inverta os arquivos, se desejar, na ordem do list.txt.
$ grep -wFf list.txt output.txt
a.1
b.1
etc
Se você list.txt
é realmente grande, talvez seja necessário abordar isso um pouco mais de forma iterativa e passar cada linha para grep separadamente. Isso aumentará enormemente o tempo de processamento. No exemplo acima, você estaria lendo output.txt
uma vez, mas desta forma você leria e processaria para cada linha list.txt. É horrível ... Mas pode ser sua única escolha. No lado positivo, ele classifica as coisas pela list.txt
ordem.
$ while read line; do grep -wF "$line" output.txt; done < list.txt
a.1
b.1
etc