“的含义;在;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代码中的短语
,即

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]
      }
  }'