A maneira mais rápida de localizar e substituir arquivos grandes ao substituir o campo presente em outro arquivo

1

Eu tenho dois arquivos. Arquivo1 é um csv com 60 campos:

111,Check1|^/h1/h2/h3,22062014184500,20,0.....
111,Check2|^/h43/h40/h9,22062014184500,4,.....
111,Check3|^/h1/h3/h4,22062014184500,0,0,.....

Arquivo2 é um arquivo de mapeamento:

OPUM04181,Check1|^/h1/h2/h3
OPUM04040235,Check3|^/h1/h3/h4
OPUM04051898,Check2|^/h43/h40/h9 

Agora o que eu tenho que fazer é no campo 2 do arquivo 1 eu tenho que substituir o campo com o campo 1 do arquivo 1 do campo correspondente 2. Exemplo:

Agora, o que tenho que fazer é substituir o campo 2 do arquivo1 pelo campo 1 da linha no campo de correspondência do arquivo2 2. Exemplo:

no arquivo1:

111,Check1|^/h1/h2/h3,22062014184500,20,0.....

será

111,OPUM04181,22062014184500,20,0..... 

em que OPUM04181Check1|^/h1/h2/h3 está mapeado no arquivo2.

Minha restrição é que o arquivo1 e o arquivo2 não têm o mesmo conjunto de valores; sua contagem é diferente. Além disso, a contagem de linhas é de 3 milhões para os dois arquivos.

Isso é o que eu estava tentando:

  • Eu executei um loop tomando o campo 2 no arquivo1
  • Eu estava verificando se esse campo está presente no arquivo2.
  • Se presente, peguei o campo 1 no arquivo2.
  • Eu estava substituindo o campo2 no arquivo1 usando sed s///g . Mas isso está levando uma quantidade enorme de tempo.

Além disso, não consigo classificar o arquivo1.

O que é um método mais rápido?

    
por roy_soham 26.06.2014 / 14:22

1 resposta

0

awk -F, -v OFS=, '
    NR==FNR {opu[$2]=$1; next} 
    $2 in opu {$2 = opu[$2]; print}
' file2 file1

Isso lê o arquivo "mapping" na memória e substitui o segundo campo por file1. Cada arquivo é processado exatamente uma vez.

A saída vai para stdout, portanto, para substituir o arquivo "in place" do

awk ... file2 file1 > tempfile && mv tempfile file1
    
por 26.06.2014 / 15:13