Como remover linhas incluídas em um arquivo de outro arquivo?

7

Eu tenho duas listas, uma lista completa e uma lista parcial. Eu quero um script bash que irá procurar a lista completa para todas as linhas que estão no parcial, se houver, elas serão removidas da lista completa. Alguém pode ajudar?

    
por AntFarmer 04.08.2013 / 07:39

3 respostas

8

grep pode ler vários padrões de um arquivo, um por linha. Combine com as opções -v para produzir linhas não correspondentes e -F para corresponder strings em vez de regex e -x para exigir que a linha inteira corresponda.

grep -Fvx -f partial.list complete.list >remaining.list &&
mv remaining.list complete.list

Obviamente, a segunda linha de comando é apenas se você quiser sobrescrever o arquivo que contém a lista completa.

Se a lista parcial é enorme e você não se importa em reordenar a lista, então join pode ser mais rápido.

    
por 06.08.2013 / 03:54
6

Se nenhuma das listas tiver elementos repetidos, o seguinte funcionará:

join -t$'\n' -v1 <(sort complete) <(sort partial)

Se as listas puderem conter elementos repetidos, e você só quiser ignorar as repetições, você pode usar o sinalizador -u nos subcomandos de classificação, que produzirão apenas elementos exclusivos.

    
por 04.08.2013 / 08:05
4

você também pode usar -

comm -23 file1 file2

os arquivos precisam ser classificados para que o comando funcione corretamente. as entradas do arquivo2 serão removidas do arquivo1 na saída do comando

    
por 17.02.2015 / 11:45