awk中“in”函数的含义

时间:2014-11-16 03:33:21

标签: awk

我并不真正理解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)

,该怎么办?

4 个答案:

答案 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