在awk中使用数组来匹配行

时间:2019-03-27 14:36:31

标签: awk text-processing

我正在尝试使用awk来匹配两个文件(文件1和文件2)。对于file2中与file1相匹配的每一行,我希望该命令打印出file1中的第二列。

我在这里查看了几种解决方案,并发现了部分有效的方法,但是我不知道它是如何工作的。

awk 'NR==FNR {a[$1]=$2; next} $1 in a{print a[$1]}' file1 file2 >> output

以下是输入示例:

#File1
0_1   apple
0_2   mango
0_3   banana
...
3_1   durian
3_4   dragonfruit
3_20  pear
#File2
0_1   3_1
0_1   3_1
0_2   3_4
0_3   3_20

当我将File2的第一列与File1匹配时,上面的awk命令返回我想要的结果。

#Output
apple
apple
mango
banana

自然,我对File2的第二列进行了少许调整以达到相同的效果。

awk 'NR==FNR {a[$1]=$2; next} $2 in a{print a[$1]}' file1 file2 >> output

但是当我期望的时候,我会收到与上面完全相同的结果:

#Expected output
durian
durian
dragonfruit
pear

使情况更糟的是,执行此操作时会得到所需的输出:

awk 'NR==FNR {a[$1]=$2; next} $1 in a{print a[$2]}' file1 file2 >> output

有人可以向我解释其背后的逻辑(将值分配给数组)还是在其他地方出了问题?

1 个答案:

答案 0 :(得分:1)

请您仔细阅读以下代码说明。它可以帮助您了解数组的概念。

awk '                      ##Starting awk program from here.
NR==FNR{                   ##Checking condition FNR==NR which will be TRUE once first Input_file named file1 is being read.
  a[$1]=$2                 ##Creating an array named a whose index is $1 of current line and value is $2(2nd field) of current line.
  next                     ##next will skip all further statements from here.
}                          ##Closing BLOCK for FNR==NR condition here.
$2 in a{                   ##Checking condition(which will be executed only when 2nd Input_file named file2 is being read.
  print a[$1]              ##Now printing value of array a whose index is $1 of current line.
}                          ##Closing BLOCK for $2  in a condition here.
' file1 file2 >> output    ##Mentioning Input_file names and placing output into output file here.

有关Array概念的其他说明:

  • a[$1]=$2的作用是什么?: :这意味着我们正在创建一个名为的数组,其索引(通过该索引可识别任何项)及其值是$ 2(当前行的第二个字段)。
  • a[$1]=$2的示例: 让我们以第一个Input_file中的0_1 apple为例,其中数组将存储为a[0_1]=apple,如上所述,它的索引是0_1,值是apple。
  • $2 in a条件的作用是什么?: 该语句实际上是一个条件,用于检查当前行的$ 2是否进入数组a(当然,检查数组a的所有索引,并比较此字符串是否匹配(如果它们匹配)(如果找到匹配项),然后打印数组a的值,其值为a[$1]