我正在学习文件比较awk
.
我找到了如下的语法,
awk 'NR==FNR{a[$1];next}$1 in a{print $1}' file1 file2
Run Code Online (Sandbox Code Playgroud)
我无法理解这NR==FNR
在什么意义?如果我尝试,FNR==NR
那么我也得到相同的输出?
到底是做什么的?
Tom*_*ech 66
在awk中,FNR
指的是当前文件中的记录号(通常是行号)并NR
引用总记录号.运算符==
是一个比较运算符,当两个周围的操作数相等时返回true.
这意味着条件NR==FNR
仅适用于第一个文件,因为FNR
每个文件的第一行重置为1,但NR
会继续增加.
此模式通常用于仅对第一个文件执行操作.在next
块内是指任何进一步的命令被跳过,所以它们仅在比所述第一其他文件运行.
该条件FNR==NR
比较了相同的两个操作数NR==FNR
,因此它的行为方式相同.
Wal*_*r A 55
在file2中查找也在file1中的键(第一行).
第1步:使用文件1的第一个单词填充数组a:
awk '{a[$1];}' file1
Run Code Online (Sandbox Code Playgroud)
步骤2:在同一命令中填充数组a并忽略文件2.为此,使用当前输入文件的编号检查到目前为止的记录总数.
awk 'NR==FNR{a[$1]}' file1 file2
Run Code Online (Sandbox Code Playgroud)
步骤3:忽略}
解析文件1时可能出现的操作
awk 'NR==FNR{a[$1];next}' file1 file2
Run Code Online (Sandbox Code Playgroud)
步骤4:在数组a中找到file2的打印键
awk 'NR==FNR{a[$1];next} $1 in a{print $1}' file1 file2
Run Code Online (Sandbox Code Playgroud)
Ed *_*ton 33
查看NR
并FNR
在awk手册中,然后问自己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
Run Code Online (Sandbox Code Playgroud)
假设你有文件a.txt和b.txt
cat a.txt
a
b
c
d
1
3
5
cat b.txt
a
1
2
6
7
Run Code Online (Sandbox Code Playgroud)
请记住NR和FNR是awk内置变量.NR - 提供处理的记录总数.(在这种情况下,在a.txt和b.txt中)FNR - 给出每个输入文件的记录总数(记录在a.txt或b.txt中)
awk 'NR==FNR{a[$0];}{if($0 in a)print FILENAME " " NR " " FNR " " $0}' a.txt b.txt
a.txt 1 1 a
a.txt 2 2 b
a.txt 3 3 c
a.txt 4 4 d
a.txt 5 5 1
a.txt 6 6 3
a.txt 7 7 5
b.txt 8 1 a
b.txt 9 2 1
Run Code Online (Sandbox Code Playgroud)
让我们添加"下一个"以跳过与NR == FNR匹配的第一个
在b.txt和a.txt中
awk 'NR==FNR{a[$0];next}{if($0 in a)print FILENAME " " NR " " FNR " " $0}' a.txt b.txt
b.txt 8 1 a
b.txt 9 2 1
Run Code Online (Sandbox Code Playgroud)
在b.txt中但不在a.txt中
awk 'NR==FNR{a[$0];next}{if(!($0 in a))print FILENAME " " NR " " FNR " " $0}' a.txt b.txt
b.txt 10 3 2
b.txt 11 4 6
b.txt 12 5 7
awk 'NR==FNR{a[$0];next}!($0 in a)' a.txt b.txt
2
6
7
Run Code Online (Sandbox Code Playgroud)