在awk中将字段拆分为数组,然后在另一个文件中搜索每个术语

时间:2015-12-29 11:53:27

标签: arrays awk split gawk

我试图将特定文件中的字段解组成数组,然后检查每个术语是否出现在第二个文件中(已存储在另一个数组中)。目标是合并两个文件中的信息。

第一个file1(我要分割的字段的那个)看起来像这样:

data1=data2=data3 some more stuff
data4=data1 this are things
data2=data5 more text here
...

虽然file2具有以下结构:

data1 10
data2 20
data3 35
data4 15
data5 60

我想使用file1拆分=的第一个字段,然后搜索第二个文件中的每个拆分字词,并按以下格式打印所有内容:

output

data1=data2=data3 some more stuff 10
data1=data2=data3 some more stuff 20
data1=data2=data3 some more stuff 35
data4=data1 this are things 15
data4=data1 this are things 10
data2=data5 more text here 20
data2=data5 more text here 60

到目前为止,我已经得到了这个:

awk 'NR==FNR {
l[$1] = $2; next
} {
la=split($1,a,"=")
for(x=1;x<=la;x++)
  print $0,l[a[$x]]
}' file2 file1 > output

首先(NR==FNR时),我使用第一个字段作为键将file2数据存储在数组l中。

然后我按以下方式解析下一个文件:对于每条记录,我使用$1作为分隔符将字段la拆分为数组=la变量存储数组a中的术语数。

对于数组afor循环)中的每个元素,我在数组l中查找相应的键并输出当前内容+ l值。

但是,出于某种原因,我只从file1获取内容(当前,不需要的输出):

data1=data2=data3 some more stuff 
data1=data2=data3 some more stuff 
data1=data2=data3 some more stuff 
data4=data1 this are things 
data4=data1 this are things 
data2=data5 more text here 
data2=data5 more text here 

关于我的代码可能出错的任何想法?

非常感谢!

2 个答案:

答案 0 :(得分:1)

awk救援!

如果您的令牌是固定长度,您可以在不拆分字段的情况下进行模式匹配

$ awk 'NR==FNR{a[$1]=$2;next}
              {for(k in a) if($1~k) print $0, a[k]}' file2 file1

data1=data2=data3 some more stuff 10
data1=data2=data3 some more stuff 20
data1=data2=data3 some more stuff 35
data4=data1 this are things 10
data4=data1 this are things 15
data2=data5 more text here 20
data2=data5 more text here 60

答案 1 :(得分:0)

我自己找到了答案。这是变量命名的问题。

这是正确的代码:

awk 'NR==FNR {
l[$1] = $2; next
} {
la=split($1,a,"=")
for(x=1;x<=la;x++)
  print $0,l[a[x]]
}' file2 file1 > output

关键在于打印功能。它现在显示为print $0,l[a[x]]而不是print $0,l[a[$x]]。循环使用x作为其内部计数器,而不是$x。现在更改它指向数组l中的正确键(来自file2)。

我离开这个帖子是因为看起来这个问题以前没有提出过。如果您认为它没用,请告诉我。

谢谢!