A maneira mais rápida de localizar e substituir um arquivo grande enquanto substitui o campo presente em outro arquivo

A maneira mais rápida de localizar e substituir um arquivo grande enquanto substitui o campo presente em outro arquivo

Eu tenho dois arquivos. File1 é 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,.....

File2 é um arquivo de mapeamento:

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

Agora o que tenho que fazer é no campo 2 do arquivo 1 substituir o campo pelo 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 do arquivo2 correspondente ao campo 2. Exemplo:

No arquivo1:

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

vai ser

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

onde OPUM04181Check1|^/h1/h2/h3é mapeado no arquivo2.

Minha restrição é que Arquivo1 e Arquivo2 não possuem o mesmo conjunto de valores; sua contagem é diferente. Além disso, a contagem de linhas é de 3 milhões para ambos os arquivos.

Isso é o que eu estava tentando:

  • Executei um loop pegando 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 field2 no arquivo1 usando sed s///g. Mas isso está levando muito tempo.

Também não consigo classificar o Arquivo1.

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

Responder1

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

Isso lê o arquivo de "mapeamento" na memória e, em seguida, substitui o segundo campo pelo arquivo1. Cada arquivo é processado exatamente uma vez.

A saída vai para stdout, então para substituir o arquivo "no local" faça

awk ... file2 file1 > tempfile && mv tempfile file1

informação relacionada