首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找到匹配的模式并用相应的值打印这条线

找到匹配的模式并用相应的值打印这条线
EN

Stack Overflow用户
提问于 2021-11-28 01:03:29
回答 2查看 598关注 0票数 1

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

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

代码语言:javascript
复制
file1.txt
MSPC_Peak_1
MSPC_Peak_10
MSPC_Peak_10
MSPC_Peak_100
MSPC_Peak_1000
.
.
.

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

代码语言:javascript
复制
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中找到相同的名称,并在其旁边添加值。

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

代码语言:javascript
复制
MSPC_Peak_1 603,277
MSPC_Peak_10 686,17
MSPC_Peak_10 686,17
. 
.

我试过这段代码

代码语言:javascript
复制
'FNR==NR{ arr[$1]; next }$1 in arr' file1 file2

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

给出像这样的输出;

代码语言:javascript
复制
MSPC_Peak_1 603,277
MSPC_Peak_10 686,17
. 
.

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-28 01:48:20

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

代码语言:javascript
复制
$ awk 'FNR==NR{ arr[NR]=$0 } 
    NR!=FNR{ for(i in arr){ 
      if(arr[i]==$1){ print arr[i],$2 } } }' file1 file2
MSPC_Peak_1 603,277
MSPC_Peak_10 686,17
MSPC_Peak_10 686,17
票数 1
EN

Stack Overflow用户

发布于 2021-11-28 05:57:18

您只需逆转文件处理,并使用以下命令完成:

代码语言:javascript
复制
awk 'FNR==NR {map[$1]=$2; next} $1 in map {print $1, map[$1]}' file2 file1

MSPC_Peak_1 603,277
MSPC_Peak_10 686,17
MSPC_Peak_10 686,17
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70139908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档