跟踪数据字段和记录

跟踪数据字段和记录

Content #

如果想在gawk脚本中跟踪数据字段和记录,那么变量FNR、NF和NR用起来非常方便。有时你并不知道记录中到底有多少个数据字段。NF变量可以让你在不知道具体位置的情况下引用记录中的最后一个数据字段:

$ gawk 'BEGIN{FS=":"; OFS=":"} {print $1,$NF}' /etc/passwd
root:/bin/bash
daemon:/usr/sbin/nologin
bin:/usr/sbin/nologin
sys:/usr/sbin/nologin
sync:/bin/sync
games:/usr/sbin/nologin
man:/usr/sbin/nologin
...
rich:/bin/bash
$

NF变量含有数据文件中最后一个字段的编号。可以在NF变量之前加上美元符号,将其用作字段变量。

FNR变量包含当前数据文件中已处理过的记录数,NR变量则包含已处理过的记录总数。下面通过几个例子来了解一下这种差别:

$ gawk 'BEGIN{FS=","}{print $1,"FNR="FNR}' data1 data1
data11 FNR=1
data21 FNR=2
data31 FNR=3
data11 FNR=1
data21 FNR=2
data31 FNR=3
$

在这个例子中,gawk脚本在命令行指定了两个输入文件(同一个输入文件指定了两次)。该脚本会打印第一个字段的值和FNR变量的当前值。注意,当gawk脚本处理第二个数据文件时,FNR的值会被重置为1。

现在加上NR变量,看看会输出什么:

$ gawk '
> BEGIN {FS=","}
> {print $1,"FNR="FNR,"NR="NR}
> END{print "There were",NR,"records processed"}' data1 data1
data11 FNR=1 NR=1
data21 FNR=2 NR=2
data31 FNR=3 NR=3
data11 FNR=1 NR=4
data21 FNR=2 NR=5
data31 FNR=3 NR=6
There were 6 records processed
$

在gawk处理第二个数据文件时,FNR变量的值被重置了,而NR变量则继续计数。

因此,如果只使用一个数据文件作为输入,那么FNR和NR的值是相同的;如果使用多个数据文件作为输入,那么FNR的值会在处理每个数据文件时被重置,NR的值则会继续计数直到处理完所有的数据文件。

From #

Linux命令行与shell脚本编程大全