找到匹配的模式并打印具有相应值的行

find matching pattern and print the line with the corresponding value

我有两个文件,一个只有名称,另一个有相关值。

第一个文件看起来像这样;

file1.txt
MSPC_Peak_1
MSPC_Peak_10
MSPC_Peak_10
MSPC_Peak_100
MSPC_Peak_1000
.
.
.

还有一个这样的文件(我们可以把这个当作参考)

file2.txt
MSPC_Peak_1 603,277
MSPC_Peak_3 690,776
MSPC_Peak_4 520,384
MSPC_Peak_5 4466,64  
.
MSPC_Peak_10 686,17
.

而且这些行数不同。

我想读取 file1 中的行并在 file2 中找到相同的名称并在其旁边添加值。

所以,输出应该是这样的;

MSPC_Peak_1 603,277
MSPC_Peak_10 686,17
MSPC_Peak_10 686,17
. 
.

我试过这个代码

'FNR==NR{ arr[]; next } in arr' file1 file2

这成功了。但是,不打印重复值。

给出类似的输出;

MSPC_Peak_1 603,277
MSPC_Peak_10 686,17
. 
.

我在研究中找不到修复它的方法,因为 awk 对我来说仍然很复杂。

在您的示例中,您正在构建一个关联数组 arr 并且在此过程中任何重复的值都会被覆盖。您最终得到数组中的唯一索引。这就是 MSPC_Peak_10 匹配只打印一次的原因。要获取所有值,只需构建一个数字索引数组并在匹配时访问所有条目。

$ awk 'FNR==NR{ arr[NR]=[=10=] } 
    NR!=FNR{ for(i in arr){ 
      if(arr[i]==){ print arr[i], } } }' file1 file2
MSPC_Peak_1 603,277
MSPC_Peak_10 686,17
MSPC_Peak_10 686,17

您可以使用以下命令反转文件处理并完成它:

awk 'FNR==NR {map[]=; next}  in map {print , map[]}' file2 file1

MSPC_Peak_1 603,277
MSPC_Peak_10 686,17
MSPC_Peak_10 686,17