在awk中将字段拆分为数组,然后在另一个文件中搜索每个术语
split field into array in awk, then search each term in another file
我正在尝试将特定文件中的字段分解为一个数组,然后检查每个术语是否出现在第二个文件中(该文件已存储在另一个数组中)。目标是合并来自两个文件的信息。
第一个 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[] = ; next
} {
la=split(,a,"=")
for(x=1;x<=la;x++)
print [=13=],l[a[$x]]
}' file2 file1 > output
首先(当 NR==FNR
时),我使用第一个字段作为键将 file2
数据存储在数组 l
中。
然后我按以下方式解析下一个文件:对于每条记录,我使用 =
作为分隔符将字段 </code> 拆分为数组 <code>la
。 la
变量存储数组中的项数 a
.
对于数组a
中的每个元素(for
循环),我在数组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
关于我的代码可能有什么问题的任何想法?
非常感谢!
我自己找到了答案。这是变量命名的问题。
这是正确的代码:
awk 'NR==FNR {
l[] = ; next
} {
la=split(,a,"=")
for(x=1;x<=la;x++)
print [=10=],l[a[x]]
}' file2 file1 > output
关键在打印功能。它现在显示为 print [=11=],l[a[x]]
而不是 print [=12=],l[a[$x]]
。该循环使用 x
作为其内部计数器,而不是 $x
。现在更改它指向数组 l
中的正确键(来自 file2
)。
我将离开 post,因为之前似乎没有人提出过这个问题。觉得不好用请告诉我
谢谢!
awk
救援!
如果您的标记是固定长度的,您可以在不拆分字段的情况下进行模式匹配
$ awk 'NR==FNR{a[]=;next}
{for(k in a) if(~k) print [=10=], 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
我正在尝试将特定文件中的字段分解为一个数组,然后检查每个术语是否出现在第二个文件中(该文件已存储在另一个数组中)。目标是合并来自两个文件的信息。
第一个 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[] = ; next
} {
la=split(,a,"=")
for(x=1;x<=la;x++)
print [=13=],l[a[$x]]
}' file2 file1 > output
首先(当 NR==FNR
时),我使用第一个字段作为键将 file2
数据存储在数组 l
中。
然后我按以下方式解析下一个文件:对于每条记录,我使用 =
作为分隔符将字段 </code> 拆分为数组 <code>la
。 la
变量存储数组中的项数 a
.
对于数组a
中的每个元素(for
循环),我在数组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
关于我的代码可能有什么问题的任何想法?
非常感谢!
我自己找到了答案。这是变量命名的问题。
这是正确的代码:
awk 'NR==FNR {
l[] = ; next
} {
la=split(,a,"=")
for(x=1;x<=la;x++)
print [=10=],l[a[x]]
}' file2 file1 > output
关键在打印功能。它现在显示为 print [=11=],l[a[x]]
而不是 print [=12=],l[a[$x]]
。该循环使用 x
作为其内部计数器,而不是 $x
。现在更改它指向数组 l
中的正确键(来自 file2
)。
我将离开 post,因为之前似乎没有人提出过这个问题。觉得不好用请告诉我
谢谢!
awk
救援!
如果您的标记是固定长度的,您可以在不拆分字段的情况下进行模式匹配
$ awk 'NR==FNR{a[]=;next}
{for(k in a) if(~k) print [=10=], 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