我正在使用来学习文件比较awk
。
我发现如下语法
awk 'NR==FNR{a[$1];next}$1 in a{print $1}' file1 file2
我不明白这有什么意义NR==FNR
?如果我尝试,FNR==NR
那么我也会得到相同的输出吗?
它到底是做什么的?
我正在使用来学习文件比较awk
。
我发现如下语法
awk 'NR==FNR{a[$1];next}$1 in a{print $1}' file1 file2
我不明白这有什么意义NR==FNR
?如果我尝试,FNR==NR
那么我也会得到相同的输出吗?
它到底是做什么的?
Two-file Processing
上backreference.org/2010/02/10/idiomatic-awk
Answers:
在awk中,FNR
指的是当前文件中的记录号(通常是行号),并NR
指的是总记录号。该运算符==
是一个比较运算符,当两个周围的操作数相等时返回true。
这意味着该条件NR==FNR
仅对第一个文件成立,因为FNR
每个文件的第一行都重置为1,但NR
仍在不断增加。
此模式通常用于仅对第一个文件执行操作。该next
块内部意味着将跳过所有其他命令,因此它们仅在第一个文件以外的文件上运行。
条件FNR==NR
将与比较两个相同的操作数NR==FNR
,因此它的行为方式相同。
a='3x'; if [[ $a == 3* ]]; then echo yes; fi
您不能同时切换的两侧==
。
在文件2中查找也在文件1中的键(行的第一个单词)。
步骤1:使用文件1的前几个字填充数组a:
awk '{a[$1];}' file1
步骤2:在同一命令中填充数组a,并忽略文件2。为此,请检查到目前为止的记录总数以及当前输入文件的编号。
awk 'NR==FNR{a[$1]}' file1 file2
步骤3:忽略}
解析文件1时可能发生的操作
awk 'NR==FNR{a[$1];next}' file1 file2
步骤4:在阵列a中找到时打印file2的键
awk 'NR==FNR{a[$1];next} $1 in a{print $1}' file1 file2
;next
中添加next
分号,但这是一个奇怪的添加(例如在步骤3中添加并需要分号)。您可以使用测试第1步awk '{a[$1]} END { for (k in a) { print "a[k]=" k } }' file1
。
在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
ARGIND
,否则可以执行FNR==1{ print ++file_nr }
。
假设您有文件a.txt和b.txt与
cat a.txt
a
b
c
d
1
3
5
cat b.txt
a
1
2
6
7
请记住,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
让“添加下一个”跳过与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
在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
a==b
和b==a
产生相同的结果,您会感到惊讶吗?