【问题标题】:split field into array in awk, then search each term in another file在 awk 中将字段拆分为数组,然后在另一个文件中搜索每个术语
【发布时间】:2016-04-03 07:18:57
【问题描述】:

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

第一个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 

关于我的代码可能有什么问题的任何想法?

非常感谢!

【问题讨论】:

  • 永远不要使用字母 l (el) 作为变量名,因为它看起来太多与数字 1 (one) 对齐,在某些字体中无法区分。

标签: arrays awk split gawk


【解决方案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

【讨论】:

    【解决方案2】:

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

    这是正确的代码:

    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)中的正确键。

    我要离开这个帖子,因为这个问题似乎以前没有人提出过。如果您认为它没有用,请告诉我。

    谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-26
      • 1970-01-01
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      • 2014-06-08
      • 1970-01-01
      • 2019-09-23
      相关资源
      最近更新 更多