“的含义;在;awk中的函数
我不太理解awk代码中的短语“的含义;在;awk中的函数,awk,Awk,我不太理解awk代码中的短语,即 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它就像for循环中的任何其他语言一样。“in”只意味着你有一个计数器,它将遍历“band”中的每个元素 因
,即
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它就像for循环中的任何其他语言一样。“in”只意味着你有一个计数器,它将遍历“band”中的每个元素
因此,当您打印波段[x]时,就像说在计数器所在的波段中打印元素。在这种情况下意味着两件不同的事情。首先:
if($i in a)sub($i,a[$i],$i)}print
在这种形式中,a
中的$i是一个逻辑测试。如果$i
是数组a
的键之一,则返回true,否则返回false
第二:
for (x in band){
print x" | " band[x]
}
在这种形式中,语句print x“|”band[x]
为分配给数组a
的每个键的x
运行一次
例子
考虑一个包含以下内容的文件:
abc
def
hij
现在,让我们使用for(a中的x)
构造运行awk
命令:
$ 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(a){…}
中的(“klm”):
$ awk '{a[$1]=NR} END{if ("klm" in a) {for (x in a) print "a[" x "]="a[x]}}' file
上面没有输出。这是因为数组a
没有klm
这样的键
相反,如果我们编写了If({…}
中的abc),那么将有以下输出:
$ 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
幸运的是,阿诺德·罗宾斯(Arnold Robbins)的《有效的Awk编程》(Efficient Awk Programming)第三版有一本书对此进行了详细的解释。您将对其中的以下部分感兴趣:
来自man awk
:
中的特殊运算符可用于测试阵列是否具有
由特定值组成的索引:
如果数组有多个下标,请在数组中使用(i,j)
中的构造也可以在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]
作为值来处理
将
运算符中的与计数器进行比较是一个糟糕的类比,因为计数器意味着线性递增顺序。此外,由于awk数组元素始终是字符串,而不是整数,因此它具有双重误导性。
if (val in array)
print array[val]
awk -F'|' 'NR>1{
band[$2]++
}
END{
print "Band | Sum"
for (x in band){
print x" | " band[x]
}
}'