什么是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==NR
与NR==FNR
有任何不同。
在awk手册中查找NR
和FNR
,然后问自己在下面的例子中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数。