什么是awk中的“NR == FNR”?

我正在学习使用awk文件比较。

我发现像下面的语法,

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

我不明白NR==FNR在这个意义上是什么意思? 如果我尝试使用FNR==NR那么我也得到相同的输出?

究竟是什么?

在file2中查找也在file1中的键(第一行字)。
第一步:用数组1的第一个字填充数组a:

 awk '{a[$1];}' file1 

步骤2:填充数组a并忽略文件2在同一个命令中。 为此,使用当前input文件的编号检查到目前为止的logging总数。

 awk 'NR==FNR{a[$1]}' file1 file2 

第3步:忽略parsing文件1时可能出现的操作

 awk 'NR==FNR{a[$1];next}' file1 file2 

步骤4:在数组a中findfile2的打印键

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

在awk中, FNR是指当前文件中的logging号(通常是行号), NR是指总logging号。 这意味着条件NR==FNR仅适用于第一个文件,因为FNR为每个文件的第一行重置为1,但NR保持增加。

此模式通常用于仅对第一个文件执行操作。 块内的next内容意味着任何进一步的命令被跳过,所以它们只能在第一个以外的文件上运行。

目前还不清楚为什么您会期望FNR==NRNR==FNR有任何不同。

在awk手册中查找NRFNR ,然后问自己在下面的例子中NR==FNR的条件是什么:

 $ cat file1 a b c $ cat file2 d e $ awk '{print FILENAME, NR, FNR, $0}' file1 file2 file1 1 1 a file1 2 2 b file1 3 3 c file2 4 1 d file2 5 2 e 

awk内置variables。

NR – 它给出处理的logging总数。

FNR – 给出每个input文件的总logging数。