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