grep conteúdo de uma lista com outra

1

Eu tenho 2 arquivos e quero aplicá-los

Lista1

ACY1
RPL3
RPL4

Lista2

1   ABHD14A-ACY1
2   ACY1
3   RPL34
4   RPL21
5   RPL3
6   RPL41

Eu tentei algo assim

grep -Fwf list1.txt list2.txt e recebi isso

1   ABHD14A-ACY1
2   ACY1
5   RPL3

Minha lista1 não tinha ABHD14A-ACY1. Existe uma maneira no grep eu posso fazer isso?

Obrigado

    
por user3138373 31.10.2018 / 23:33

2 respostas

1

A opção -w faz com que grep correspondam a palavras inteiras. Infelizmente, ABHD14A-ACY1 corresponde a ACY1 devido ao traço. Você pode querer adicionar um espaço ao arquivo padrão como

sed 's/^/ /' file1 | grep -Fwf- file2
2   ACY1
5   RPL3
    
por 01.11.2018 / 00:46
1

A opção -w retorna correspondências que formam palavras inteiras.

O motivo pelo qual ele retorna ABHD14A-ACY1 e não RPL41 é porque ACY1 está no final da primeira e segunda linhas, enquanto RPL4 não está no início nem no final de nenhuma linha nem é seguido por um caractere constituinte não-palavra que significa algo diferente de letra, número ou sublinhado. Isso é coberto na página man de grep .

Para testar isso, se você adicionar 1 ao final da primeira linha para que seja 1 ABHD14A-ACY11 e remova o 1 do final da sexta linha para que seja 6 RPL4 , sua saída ficará assim :

2   ACY1
5   RPL3
6   RPL4

Não há como não retornar a primeira linha com o comando exato que você tem ou apenas chamando grep por conta própria. Você teria que canalizá-lo para sed para remover a primeira linha:

grep -Fwf list1.txt list2.txt | sed '/ABHD14A/d'

Ou canalize-o em awk para imprimir apenas o que grep retorna após a linha que contém o que você não deseja corresponder:

grep -Fwf list1.txt list2.txt | awk 'NR>1'

Ou canalize-o para grep -v para excluir a primeira linha:

grep -Fwf list1.txt list2.txt | grep -v ^1

Existem outras maneiras de fazer isso, mas essas são as mais fáceis e permitem que você canalize apenas o que você já tem.

    
por 01.11.2018 / 01:12