61. FNR - 文件记录数
我们已经知道
NR
是 Number of Records
(或 Number of the Record
),它打印正在处理的文件的当前行号。
当我们给出两个输入文件时,
NR
会如何表现?
NR
在多个文件之间不断增长。
当主体块开始处理第二个文件时,
NR
不会重置为 1,而是将从前一个文件的最后一个
NR
数值继续。
在以下示例中,第一个文件有 5 条记录,第二个文件有 5 条记录。
如下所示,当主体循环处理第二个文件时,
NR
从 6 开始(而不是 1)。
最后,在 END
块中,
NR
给出两个文件组合的记录总数。
$ awk 'BEGIN {FS=","} \ {print FILENAME ": record number",NR,"is",$1;} \ END {print "Total number of records:",NR}' \ employee.txt employee-multiple-fs.txt employee.txt: record number 1 is 101 employee.txt: record number 2 is 102 employee.txt: record number 3 is 103 employee.txt: record number 4 is 104 employee.txt: record number 5 is 105 employee-multiple-fs.txt: record number 6 is 101 employee-multiple-fs.txt: record number 7 is 102 employee-multiple-fs.txt: record number 8 is 103 employee-multiple-fs.txt: record number 9 is 104 employee-multiple-fs.txt: record number 10 is 105 Total number of records: 10
在上面的示例中,我们有两个输入文件employee.txt
和employee-multiple-fs.txt
。
每个文件各有 5 条记录。 因此,在处理完第一个文件后,
NR
继续递增。
FNR
提供当前文件中的记录编号。
因此,当 awk 执行完第一个文件的主体块并开始下一个文件的主体块时,
FNR
将再次从 1 开始。
$ awk 'BEGIN {FS=","} \ {print FILENAME ": record number",FNR,"is",$1;} \ END {print "Total number of records:",NR}' \ employee.txt employee-multiple-fs.txt employee.txt: record number 1 is 101 employee.txt: record number 2 is 102 employee.txt: record number 3 is 103 employee.txt: record number 4 is 104 employee.txt: record number 5 is 105 employee-multiple-fs.txt: record number 1 is 101 employee-multiple-fs.txt: record number 2 is 102 employee-multiple-fs.txt: record number 3 is 103 employee-multiple-fs.txt: record number 4 is 104 employee-multiple-fs.txt: record number 5 is 105 Total number of records: 10
以下示例显示了
NR
和
FNR
:
$ vi fnr.awk BEGIN { FS="," } { printf "FILENAME=%s NR=%s FNR=%s\n", FILENAME, NR, FNR; } END { printf "END Block: NR=%s FNR=%s\n", NR, FNR } $ awk -f fnr.awk employee.txt employee-multiple-fs.txt FILENAME=employee.txt NR=1 FNR=1 FILENAME=employee.txt NR=2 FNR=2 FILENAME=employee.txt NR=3 FNR=3 FILENAME=employee.txt NR=4 FNR=4 FILENAME=employee.txt NR=5 FNR=5 FILENAME=employee-multiple-fs.txt NR=6 FNR=1 FILENAME=employee-multiple-fs.txt NR=7 FNR=2 FILENAME=employee-multiple-fs.txt NR=8 FNR=3 FILENAME=employee-multiple-fs.txt NR=9 FNR=4 FILENAME=employee-multiple-fs.txt NR=10 FNR=5 END Block: NR=10 FNR=5