awk关联数组以模式作为索引

3

如何让AWK将搜寻到的模式及其所在行存储在数组中,这样做最好的解决方案是什么?我需要编写一个shell脚本吗?还是只需要使用AWK就可以搞定呢?

例如,如果我搜索单词“吉他”,它会创建一个数组,其中包含该单词出现在第13行、第18行和第89行等信息?

awk '/home/ {
array[$0] = NR 
}
END {
for(i in array) print i, array[i] }' 1-1000.txt

例如,这将打印匹配的行以及它们被发现的编号...但是我不需要 $0,而是那个“home”模式,作为关联数组的索引,该数组将以行作为值。但是再次出现了问题,如何为该索引有多个值?
1个回答

5

了解 keys 是唯一的很重要。所以,如果你打算将搜索模式作为键存储,将行号作为值,则该值将被最后一行看到的模式覆盖。

因此,一个好的方法是:

awk '{a[NR]=$1} END {for (k in a) if(a[k]=="monkey") print k}' textile

输出:

[jaypal:~] cat textfile
monkey
donkey
apple
monkey
dog
cat
mat
horse
monkey
[jaypal:~] awk '{a[NR]=$1} END {for (k in a) if(a[k]=="monkey") print k}' textfile
4
9
1

如果你需要迭代每一行以查找特定的模式并将其存储,那么可以使用 for循环 来检查每个单词并在找到所需单词后将其存储为数组。

awk '{ for (i=1;i<=NF;i++) if($i=="pattern") arry[NR]=$i } END {. . .}' inputfile

根据评论更新:

要迭代两个文件(其中一个用作查找的参照,另一个用于搜索匹配参照的行)。

awk 'NR==FNR{a[NR]=$1; next} {for (x in a) if ($0 ~ a[x]) print $0 " found because of --> " a[x]}' textile text2

测试:

[jaypal:~] cat text2
monkeydeal
nodeal
apple is a good fruit

[jaypal:~] awk 'NR==FNR{a[NR]=$1; next} { for (x in a) if ($0 ~ a[x]) print $0 " found on line number " FNR " because of --> " a[x]}' textfile text2
it is a good monkeydeal found on line number 1 because of --> monkey
it is a good monkeydeal found on line number 1 because of --> monkey
it is a good monkeydeal found on line number 1 because of --> monkey
apple is a good fruit found on line number 3 because of --> apple

我正在使用类似于你的列表,然后对于每一行作为模式,我想记住在第二个文件中找到它的行... 第二个文件将有例如说monkeydeal的行,而来自第一个列表的monkey将匹配并记住它在第二个文件中找到的行... 感谢第一个解决方案,因为这将在bash脚本中很有用,通过将monkey作为正则表达式传递以提取行号。 - branquito
所以,从我的示例中,“home”来自第一个文件,并且1-1000.txt是我匹配以查看其包含的行的文件。 - branquito
@branquito 我在答案中添加了一个更新。希望能帮到你。祝好运。 - jaypal singh
太棒了,但是我该如何获取被发现的行数呢?因此,它应该说在第一行找到了 monkeydeal,因为-->monkey,在第三行找到了 apple is a good fruit,因为-->apple(行号应来源于第二个文件,所以在这个例子中是文本2)。谢谢! - branquito
@branquito 这很简单。使用 FNR 存储每个文件的行号。在这种情况下,它将是第二个文件的行号。 - jaypal singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接