Sua solução de classificação pode ser um pouco mais rápida se você classificar os arquivos separadamente e, em seguida,
use comm
para encontrar as linhas não comuns:
sort a.txt -o a.txt
sort b.txt -o b.txt
comm -3 a.txt b.txt | sed 's/^\t//'
Como alternativa, se um dos seus arquivos de dados não for muito grande, você poderá ler tudo em um array associativo e comparar o outro arquivo linha por linha. Por exemplo, com o awk:
awk '
ARGIND==1 { item[$0] = 1; next }
ARGIND==2 { if(!item[$0])print; else item[$0] = 2 }
END { for(i in item)if(item[i]==1)print i }
' a.txt b.txt
No acima, ARGIND
conta os argumentos dos arquivos.
A primeira linha salva o arquivo 1 linhas na matriz item
. A próxima linha vê se a linha atual do arquivo 2 está nessa matriz. Se não for impresso, notamos que este item foi visto em ambos os arquivos. Finalmente, imprimimos os itens que não foram vistos nos dois arquivos.
Se um de seus arquivos for muito menor que o outro, é melhor colocá-lo primeiro nos argumentos para que a matriz de itens permaneça pequena:
if [ $(wc -l <a.txt) -lt $(wc -l <b.txt) ]
then args="a.txt b.txt"
else args="b.txt a.txt"
fi
awk '
ARGIND==1 { item[$0] = 1; next }
ARGIND==2 { if(!item[$0])print; else item[$0] = 2 }
END { for(i in item)if(item[i]==1)print i }
' $args