Como o pedido não importa, você pode usar o awk para imprimir linhas exclusivas, mas com linhas de separação de espaço em branco:
awk -v RS='[[:space:]]+' 'FNR==NR {a[$0]++; next} {a[$0]--} END {for (i in a) if (a[i] != 0) print i}' file1 file2
Aqui:
-
-v RS='[[:space:]]+'
define o separador de registro (RS) para qualquer espaço em branco, portanto, cada "linha" será separada por qualquer espaço em branco (incluindo novas linhas). -
FNR == NR
-FNR
é o número do registro (NR
) (ou, número da linha, se preferir) para o arquivo atual eNR
é o número geral da linha em todos os arquivos de entrada. Então, sempre que esses dois são iguais, estamos lidando com o primeiro arquivo. -
{a[$0]++; next}
- define e incrementa a contagem de aparências da "linha" atual, depois passa para a próxima linha sem processar mais nenhuma regra. Esse bloco é executado apenas para o primeiro arquivo, portanto, o efeito é que essa regra se aplica a linhas do primeiro arquivo e o próximo bloco se aplica a todos os outros arquivos. -
{a[$0]--}
, diminui a contagem de aparências da "linha" atual. -
END {for (i in a) if (a[i] != 0) print i}
- no final de todas as entradas, para cada entrada na matriza
, imprima essa entrada se a contagem de aparências não for 0. Assim, qualquer "linha" que tenha sido vista um número igual de vezes em ambos os arquivos será ignorado.