Estou tendo algum problema técnico com código awk [closed]

0

Isso está relacionado a uma das minhas perguntas anteriores: Comparando texto arquivos usando Bash e AWK

arquivo1.txt

Name  Col1  Col2  Col3  
-----------------------
row1  1     4     7        
row2  2     5     8         
row3  3     6     9 

arquivo2.txt

Name  Col1  Col2  Col3  
-----------------------        
row1  1     4     7
row2  2     5     999

De alguma forma, descobri uma maneira de comparar dois arquivos. Mas, por algum motivo, não está me dando o resultado que quero. Bare comigo como eu sou um novato. Aqui está o código que eu uso para comparar os arquivos.

awk '
FNR < 2 { next }
FNR == NR {
    for (i = 2; i <= NF; i++) 
    {
        a[i,$1] = $i; 
    }    
    b[$1];
    next;

}
($1 in b) {
   for (i = 2; i <= NF; i++) 
   {
      if (a[i,$1] == $i) 
          printf("%s->Col%d: %d vs %d: Equal\n", $1, i-1, a[i,$1], $i);
      else 
          printf("%s->Col%d: %d vs %d: Not Equal\n", $1, i-1, a[i,$1], $i);
   }
} ' file1.txt file2.txt

Resultado esperado:

row2->Col1: 1 vs 1: Equal
row2->Col2: 4 vs 4: Equal
row2->Col3: 7 vs 7: Equal
row1->Col1: 2 vs 2: Equal
row1->Col2: 5 vs 5: Equal
row1->Col3: 8 vs 999: Not Equal

Resultado real:

row2->Col1: 1 vs 1: Equal
row2->Col2: 4 vs 4: Equal
row2->Col3: 0 vs 7: Not Equal
row1->Col1: 2 vs 2: Equal
row1->Col2: 5 vs 5: Equal
row1->Col3: 0 vs 999: Not Equal

Eu não sei porque 0 é parte da saída. Alguém sabe porque 0 está lá?

EDIT: Aqui está o problema. O primeiro loop for apenas itera uma vez. Alguém sabe por quê?

    
por Alias 19.06.2014 / 20:46

1 resposta

2

Bug: altere

FNR == NR {
    for (i = 2; i <= NF; i++) 
    {
        a[i,$1] = $i; 
        b[$1];
        next;
    }
}

para

FNR == NR {
    for (i = 2; i <= NF; i++) 
    {
        a[i,$1] = $i; 
    }
    b[$1];
    next;
}

Você estava chamando next após i==2

    
por 19.06.2014 / 21:21

Tags