Aqui está uma sugestão. A saída de:
paste 1.txt 2.txt | awk '
{ FS = "\t" }
NR == 1 { n = NF/2 } {
for(i=1;i<=n;i++) print "\"" $i "\" " ($i == $(i+n) ? "==":"!=") " \"" $(i+n) "\""
print "###############"
}'
que compara e imprime todos os campos em todos os registros entre arquivos, termina com:
"ID60" == "ID60"
"Steve" != "Mark"
"Goldberg" != "Waugh"
"" != "St. Petersburg"
"6666600000" != "7777700000"
###############
"" != "8888800000"
"ID70" != ""
"John" != ""
"Smith" != ""
"" == ""
###############
Existem dois erros:
-
Existe um erro oculto off-by-one no caso de uma linha existente apenas no segundo arquivo. Isso ocorre porque um registro ausente possui um campo, uma string vazia antes da guia adicionada por
paste. Portanto, neste caso, você está efetivamente comparando os campos na ordem 5,1,2,3,4. -
O campo 4 está vazio para esta linha em ambos os arquivos (embora de maneiras diferentes), então eu teria esperado a saída:
Line No. 7 COLUMN NO 1,2,3,5
Para obter a saída exata desejada, a correção básica abaixo relatará que todos os campos não correspondem se uma linha estiver presente apenas em um arquivo. Isso pode ser detectado pelo NF == n+1 adicionado ao if , porque deve haver apenas n+1 e não 2*n campos para uma linha apenas presente em um arquivo, o arquivo que for.
paste 1.txt 2.txt | awk '
{ FS = "\t" }
NR == 1 { n = NF/2 } {
for(i=1;i<=n;i++) if(NF == n+1 || $i!=$(i+n)) {c = c s i; s = "," }
if(c){print "Line No. " NR-1 " COLUMN NO " c; c = "" ; s = "" }
}'
Isso pressupõe que todos os registros contenham o número correto de guias, n-1 .