Compare 2 ARQUIVOS e imprima o número da linha para registro não correspondente e número de coluna para cada registro não correspondente em TEST2.txt

0

Em TEST1.txt

ID_ID   First_name    Last_name   Address                        Contact_Number
ID1     John          Rock        32, Park Lake, California           2222200000
ID2     Tommy         Hill    5322 Otter Lane Middleberge         3333300000
ID3     Leonardo      Test        Half-Way Pond, Georgetown           4444400000
ID8     Rhyan         Bigsh       6762,33 Ave N,St. Petersburg        5555500000
ID50    Steve         Goldberg    6762,33 Ave N,St. Petersburg        6666600000

& &

Em TEST2.txt

ID_ID   First_name    Last_name   Address                        Contact_Number
ID1     John          Rock        32, Park Lake, California           2222200000
ID2     Tommy1        Hill1       5322 Otter Lane Middleberge         3333300000
ID3     Leonardo      Test        Half-Way Pond, Georgetown           4444400000
ID80    Sylvester     Stallone                                    5555500000
ID50    Steve         Goldberg    6762,33 Ave N,St. Petersburg    6666600000
ID60    Mark          Waugh       St. Petersburg                  7777700000

Resultado desejado: -

A diferença em TEST2.txt é o número da linha e o número da coluna (em que os valores não correspondem)

Line No. 2 COLUMN NO 2,3    
Line No. 4 COLUNN NO 1,2,3,4 
Line No. 6 COLUNN NO 1,2,3,4,5   

Observação: o tamanho do arquivo a ser comparado está em GB e o arquivo é separado por separadores e tem mais de 250 colunas separadas por separadores.

    
por Mayank Parekh 22.02.2017 / 12:54

1 resposta

0

Desajeitado mas trabalhando:

BEGIN {
    FS=OFS="\t"
}

NR==FNR {
# 5 = number of columns
    for (i=0;i<=5;i++) {
        a[$1,i]=$i }
    }

{ if ( a[$1,0] != $0 ) {
    b=""
    for (i=1;i<=5;i++) {
        if ( a[$1,i] != $i ) {
            b=b i", "
            }
        }
    print "Line No." FNR," Column No. ",b
    }
}

No entanto, sugiro strongmente que você escreva um programa FORTRAN (ex.) para isso, pois você pode ler os dados em pedaços de - digamos - 10.000 linhas, enquanto awk -solutions precisa conter pelo menos um arquivo na RAM o que pode ser um problema para seus arquivos de tamanho GB. Poderia ser assim:

  • leia blocos de dados de cada arquivo no array (linha e coluna)
  • compare matrizes e crie uma matriz lógica com o resultado de a (i, j) = b (i, j)
  • nós matriz lógica para criar saída
  • imprima a saída e leia o próximo bloco

Como seus arquivos são classificados e apresentam todas as linhas, é bastante simples.

    
por 23.02.2017 / 08:59