awk中 NR 和 NF到底是什么意思? 能举例说明吗?

供稿:hz-xin.com     日期:2024-05-14
linux shell脚本awk替换中的NF跟NR的意义

NF表示第几个字段,每个字段默认用空格分开。
NF-3的意思是倒数第三个字段,ssh2是第-0个字段,663951是第-1个字段....
192.168.0.78是第-3个字段。

NR==2就是对第二行执行后面的操作,也就是 {print $0}, 而print $0 的意思就是打印当前行,也就是第二行。所以

awk 'NR==n{print $0}' file

这条命令的作用就是打印 file 文件的第n行。

NR - Number of Record - 当前处理的行是第几行(因为awk是流处理工具,一行一行处理的,所以NR在不停的自增1)
FNR - File Number of Record - 当前处理的行是当前处理文件的第几行
NF - Number of Fileds - 当前行有多少列数据(这个在每行都会根据设定的分割符重新计算,默认分割符是任意连续的多个空白符)

(NR==FNR) 大致等效于 (ARGIND==1) , 一般用来判断是不是在处理第一个文件。
但区别是: 前者是判断当前处理的总行数跟文件内行数相等,而这种情况一般都是在第一个文件上,而ARGIND==1是参数位置第1的文件时生效。—— 但,如果前面的文件是空的,那么NR==FNR就生效于第一个非空文件,而ARGIND==1不会。这微妙的区别使它们可以应用于不同的需要。
实际使用中还可以用文件名判断当前处理的是哪一个文件。
上面几种使用的环境: 用awk连续处理多个文件时,比如 awk '命令序列' file1 file2 file* 这样的情况下,判断在处理哪个文件了。

比如现在AWK处理到第五行。第一行没有进行操作,2,3,4,5行进行了操作,那么NR=5,FNR=4

NR==FNR 表示从起始行到当前行,awk都进行了操作,比如修改,添加等等

简单来说,NR就是当前读取多少行,FNR就是当前修改了多少行,FNR<=NR