在一个文件中查找字符串并在另一个文件中使用它

在一个文件中查找字符串并在另一个文件中使用它

file 1需要hdu在第 2 列(或HX*第 5 列)中查找包含字符串的行,然后将file 2第 2 列中的值替换为第 5 列中的值file 1

文件1:

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

文件2:

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

在给定的情况下,我需要替换XX67HX67、 和XX68HX68以便输出为:

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

我最好的猜测是命令

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

但它只替换了最后一次出现的情况。

答案1

这是因为您的xy值被覆盖,因此只有 file1 的最后一行会保留。尝试使用数组对单行代码进行小的修改:

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

相关内容