
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 OPUM04181
↔ Check1|^/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