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
.