• 本页内容

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.txtemployee-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