awk连载4: awk里的变量
FS 表示分隔符,前面说过了
OFS 输出的分隔符,默认是空格
前面提了一下,在print语句里如果使用逗号做分隔符的话,输出时默认是以空格分隔开
这个输出的分隔符是由OFS来决定,如果想修改此分隔符只要定义OFS变量即可,如下:
FILENAME
FILENAME用于显示文件当前正在处理的文件名是什么。
这里NR表示行数,后面会单独讲解,这行的意思就是当处理到第一行的时候,就打印当前文件的名字。
NF
用于指明每行被分成的了几段
看下aa.txt的内容
[root@vms63 ~]# cat aa.txt
aaa 1 root 11111 ----4段
bbb 2 ro2t 222 ddd aaa ----5段
ccc 3 xxxx r22t dddd ---4段
ddd 4 yyy root 222 ---4段
eee 5 aaa zzz ----4段
[root@vms63 ~]#
练习:查看每行第二部分小于3的那些行,被awk分成了几段:
练习:
查看每行最后一部分的值
这里NF显示的每行的分段数,则$NF显示的就是本行最后一个分段的值。
如果要查看每行倒数第二个分段的值,可以用
这里支持数字的加减算法。
NR
NR表示当前正在处理的行号
如上,当文件对aa.txt进行循环的时候,因为没有指明条件所以对文件的每一行进行循环。当循环到第一行的时候,此时行号为1,所以NR的值为1, 打印1和本行内容($0),以此类推,直到把所有行全部打印完成为止。
FNR
FNR 表示当前正在处理的行号和NR的效果类似
也是上面的例子:
看到的效果是和NR的效果是一样的。
NR和FNR的区别
在处理单个文件时,NR和FNR是没有区别的,但是同时处理多个文件的话,NR和FNR就不一样了。
假设两个文件bb.txt和cc.txt内容分别如下:
bb.txt |
cc.txt |
aaa bbb ccc |
xxx yyy zzz |
用awk同时对两个文件操作
NR |
文件内容 |
FNR |
|
|
|
1 2 3 4 5 6 |
aaa bbb ccc xxx yyy zzz |
1 2 3 1 2 3 |
NR会把两个文件加在一起算总行数,FNR会分别计算每个文件的行数。
练习如下:
所以可以依据此来判断当前处理的是bb.txt还是cc.txt。
如果NR==FNR则处理的是前面的文件即bb.txt,如果NR!=FNR的话则处理的是后面的文件即cc.txt。
练习:
这里是当NR==FNR时及处理bb.txt文件的时候,打印行号及文件名
这里是当NR!=FNR时及处理cc.txt文件的时候,打印行号和文件名。