什么是最好的解决方案让awk存储搜索模式以及在数组中找到它的行..我需要一个shell脚本,或者它只能使用awk来完成..
所以,例如,如果我搜索单词'guitar',它会产生一个数组,其中包含例如在第13,18和89行找到该单词的信息?
awk '/home/ {
array[$0] = NR
}
END {
for(i in array) print i, array[i] }' 1-1000.txt
Run Code Online (Sandbox Code Playgroud)
例如,这将打印与找到它们的数字相匹配的行..但我不需要$ 0但是'home'模式,作为关联数组的索引,它将行作为值...但是然后又有问题如何有一个索引的多个值?
重要的是要知道它keys是独一无二的.因此,如果您打算将搜索模式存储为键和行号作为值,则值将被模式的最后一行覆盖.
所以这样做的好方法是:
awk '{a[NR]=$1} END {for (k in a) if(a[k]=="monkey") print k}' textile
Run Code Online (Sandbox Code Playgroud)
[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
Run Code Online (Sandbox Code Playgroud)
如果你需要迭代遍历以查找特定模式并存储它,那么你可以使用它for loop来检查该行的每个单词,一旦找到你的单词就将其存储为数组.
awk '{ for (i=1;i<=NF;i++) if($i=="pattern") arry[NR]=$i } END {. . .}' inputfile
Run Code Online (Sandbox Code Playgroud)
根据评论更新:
迭代两个文件(其中一个用作查找,第二个用于搜索与查找匹配的行).
awk 'NR==FNR{a[NR]=$1; next} {for (x in a) if ($0 ~ a[x]) print $0 " found because of --> " a[x]}' textile text2
Run Code Online (Sandbox Code Playgroud)
[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
Run Code Online (Sandbox Code Playgroud)