Sim. A ferramenta padrão grep
para procurar arquivos por strings de texto pode ser usada para subtrair todas as linhas em um arquivo de outro.
grep -F -x -v -f fileB fileA
Isso funciona usando cada linha no arquivo B como um padrão ( -f fileB
) e tratando-a como uma string simples para corresponder (não uma regex regular) ( -F
). Você força a correspondência a acontecer na linha inteira ( -x
) e imprime somente as linhas que não correspondem ( -v
). Portanto, você está imprimindo as linhas no arquivo A que não contêm os mesmos dados de qualquer linha no arquivo B.
A desvantagem dessa solução é que ela não considera a ordem da linha e, se sua entrada tiver linhas duplicadas em lugares diferentes, talvez você não consiga o que espera. A solução para isso é usar uma ferramenta de comparação real, como diff
. Você poderia fazer isso criando um arquivo diff com o valor de contexto em 100% das linhas no arquivo e, em seguida, analisando-o apenas para as linhas que seriam removidas se convertesse o arquivo A no arquivo B. (Observe também este comando) remove a formatação do diff depois de obter as linhas certas.)
diff -U $(wc -l < fileA) fileA fileB | sed -n 's/^-//p' > fileC