Use uma lista de palavras para grep em outra lista

4

Eu tenho uma lista com 250 linhas. Eu tenho que executar todos eles através de um servidor web para obter uma lista de saída. Essa lista, no entanto, retorna muito mais linhas do que me interessa. Diga, meu list.txt é:

a.1
b.1
etc

a saída é output.txt :

a.1 a b c
a.2 b a b
a.3 d k o
b.1 b o p
b.2 o i y
b.3 p i y
etc

É possível usar o comando grep para procurar todas as palavras em list.txt no output.txt e, em seguida, gerar a lista desejada "wanted.txt"? Eu preciso da linha inteira no meu output.txt Eu sou novo em scripts, mas o que eu gostaria é de algo como

grep list.txt output.txt > wanted.txt

Não consegui encontrar nenhum exemplo disso

    
por Ditte 11.03.2015 / 09:28

1 resposta

7

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
    
por Oli 11.03.2015 / 09:38

Tags