Subtraia o conteúdo de um arquivo de texto do conteúdo de outro arquivo de texto no Linux

6

Eu tenho dois arquivos de texto no Linux. Um contém uma lista de IDs válidos. Por exemplo:

abcd
efgh
ijkl
etc.

O outro contém uma lista de códigos inválidos. Mas, alguns deles também aparecem na lista de IDs válidos, neste exemplo "efgh":

mnop
qrst
efgh
etc.

Como posso construir facilmente um arquivo de texto que contenha todas as linhas da lista inválida que não aparecem na lista válida? Ou seja, eu quero acabar com um arquivo de texto que tenha:

mnop
qrst
etc.

Eu gostaria de alguma mágica de linha de comando do Linux de alguns truques inteligentes do Vim. Obrigado antecipadamente!

    
por Sander Marechal 07.07.2010 / 10:18

3 respostas

9

Acho que comm pode ajudar você a fazer o que quiser.

É uma ferramenta de linha de comando menos conhecida que deve estar presente na maioria dos sistemas Linux.

    
por 07.07.2010 / 10:43
0

Supondo que você tenha arquivos com o nome valid e invalid , você pode classificá-los:

sort valid > valid-sorted; sort invalid > invalid-sorted

compare:

diff valid-sorted invalid-sorted

A saída será (supondo seus dados de exemplo):

1d0
< abcd
3c2,3
< ijkl
---
> mnop
> qrst

As coisas com '<' é apenas no primeiro arquivo, o material com '>' somente no segundo (inválido).

Assim, diff valid-sorted invalid-sorted |grep '^>' deve fornecer as strings que aparecem inválidas, mas que não são válidas.

Removendo o principal ">" é deixado como um exercício para o leitor; -).

Advertência: isso não funcionará se seus arquivos de entrada realmente contiverem '>' no início de uma linha. Você terá que fazer alguns truques então ...

    
por 07.07.2010 / 10:52
0

Eu tenho meu próprio utilitário para isso, que se baseia em another ; eles também trabalham com entrada não classificada. Uso básico é

except file1 file2 > file2-except-any-lines-in-file1
    
por 07.07.2010 / 11:04

Tags