我并不真正理解awk代码中的短语in
,即
awk -F'|' 'NR>1{
band[$2]++
}
END{
print "Band | Sum"
for (x in band){
print x" | " band[x]
}
}'
和
awk -F"|" 'NR==FNR{a[$1]=$2;next}{for(i=3;i<=NF;i++){if($i in a)sub($i,a[$i],$i)}print}' OFS="|" lookupfile contentfile
如果短语是if($x in array)
和for(x in array)
?
答案 0 :(得分:1)
来自man awk
:
中的特殊运算符可用于测试数组是否具有 索引由特定值组成:
if (val in array)
print array[val]
如果数组有多个下标,请在数组中使用(i,j)。
in 构造也可以在for循环中用于迭代 数组的所有元素。
所以你的剧本:
awk -F'|' 'NR>1{
band[$2]++
}
END{
print "Band | Sum"
for (x in band){
print x" | " band[x]
}
}'
以下内容:
band[$2]++
创建一个数组band
,在其中存储每个第二个字段出现次数的计数器。for (x in band)
循环遍历数组band
中的元素,用它们做一些事情。请注意,for (x in band)
允许您将元素x
作为索引,band[x]
作为值。答案 1 :(得分:0)
就像for循环中的任何其他语言一样。 “in”只意味着你有一个计数器,它将遍历“band”中的每个元素
因此,当你打印band [x]时,就像是在打印计数器所在的IN带元素。
答案 2 :(得分:0)
in
意味着两件不同的事情。第一:
if($i in a)sub($i,a[$i],$i)}print
在这种形式中,$i in a
是一个逻辑测试。如果$i
是数组a
的键之一,则返回true,否则返回false。
第二
for (x in band){
print x" | " band[x]
}
在此表单中,语句print x" | " band[x]
为x
运行一次,分配给数组a
的每个键。
考虑一个包含以下内容的文件:
abc
def
hij
现在,让我们使用awk
构造运行for (x in a)
命令:
$ awk '{a[$1]=NR} END{for (x in a) print "a[" x "]="a[x]}' file
a[def]=2
a[hij]=3
a[abc]=1
第一部分a[$1]=NR
创建一个数组a
,其键是行上的第一个单词$1
,其值是记录(行)的编号发生了这个词,NR
。
for
循环遍历数组的每个键。但是,它不会以任何特定的顺序通过它们。
现在,让我们在上面的代码中添加一个if
条件。我们将使用if ("klm" in a) {...}
:
$ awk '{a[$1]=NR} END{if ("klm" in a) {for (x in a) print "a[" x "]="a[x]}}' file
以上不产生输出。这是因为数组a
没有klm
这样的密钥。
相反,如果我们写了if ("abc" in a) {...}
,那么会有输出:
$ awk '{a[$1]=NR} END{if ("abc" in a) {for (x in a) print "a[" x "]="a[x]}}' file
a[def]=2
a[hij]=3
a[abc]=1
答案 3 :(得分:0)
幸运的是,有一本书解释了这一切,有效的Awk编程,第三版,作者Arnold Robbins。您对这些部分感兴趣:
http://www.gnu.org/software/gawk/manual/gawk.html#Reference-to-Elements
http://www.gnu.org/software/gawk/manual/gawk.html#Scanning-an-Array