Encontre uma string em um arquivo e use-a em outro arquivo

0

Em file 1 , preciso encontrar linhas que contenham a string hdu na coluna 2 (ou HX* na coluna 5) e, em seguida, em file 2 substituir o valor na coluna 2 pelo valor da coluna 5 de file 1 .

arquivo1:

64 ha 1 LIG H64 64 0.000000 12.0100 c 0.637086 12.0100
65 du 1 LIG XX65 65 0.000000 16.0000 o -0.547014 16.0000
66 du 1 LIG XX66 66 0.000000 16.0000 oh -0.611114 16.0000
67 hdu 1 LIG HX67 67 0.000000 1.0080 hc 0.090186 1.0080
68 hdu 1 LIG HX68 68 0.000000 1.0080 hc 0.090186 1.0080

arquivo2:

1LIG    H64   64    2.06144000    1.94117000    2.65125000
1LIG   XX65   65    2.14737000    1.92392000    2.73722000
1LIG   XX66   66    1.98154000    2.05095000    2.64407000
1LIG   XX67   67    2.21440000    1.72650000    2.55862000
1LIG   XX68   68    2.22046000    1.85502000    2.43909000

No caso em questão, preciso substituir XX67 por HX67 e XX68 por HX68 , para que a saída seja:

1LIG    H64   64    2.06144000    1.94117000    2.65125000
1LIG   XX65   65    2.14737000    1.92392000    2.73722000
1LIG   XX66   66    1.98154000    2.05095000    2.64407000
1LIG   HX67   67    2.21440000    1.72650000    2.55862000
1LIG   HX68   68    2.22046000    1.85502000    2.43909000

Meu melhor palpite foi o comando

awk 'FNR==NR && $2=="hdu" {x=$1;y=$5} NR!=FNR { if ($3==x) {$2=y} print}' file1 file2

mas substituiu apenas a última ocorrência.

    
por user318543 30.10.2018 / 21:37

1 resposta

0

Isso porque seus valores x e y são sobrescritos e, portanto, apenas a última linha do arquivo1 persistirá. Tente esta pequena adaptação do seu one-liner usando um array:

awk 'FNR==NR && $2=="hdu" {y[$1] = $5} NR!=FNR { if ($3 in y) {$2 = y[$3]} print} ' file1 file2
    
por 31.10.2018 / 18:15

Tags