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.
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!
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 ...
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