awk连载4: awk里的变量

FS 表示分隔符,前面说过了

OFS 输出的分隔符,默认是空格

前面提了一下,在print语句里如果使用逗号做分隔符的话,输出时默认是以空格分隔开

awk连载4: awk里的变量 

这个输出的分隔符是由OFS来决定,如果想修改此分隔符只要定义OFS变量即可,如下:

awk连载4: awk里的变量 

FILENAME

FILENAME用于显示文件当前正在处理的文件名是什么。

awk连载4: awk里的变量 

这里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分成了几段:

awk连载4: awk里的变量 

练习:

查看每行最后一部分的值

awk连载4: awk里的变量 

这里NF显示的每行的分段数,则$NF显示的就是本行最后一个分段的值。

 

如果要查看每行倒数第二个分段的值,可以用

awk连载4: awk里的变量 

这里支持数字的加减算法。

NR

NR表示当前正在处理的行号

awk连载4: awk里的变量 

如上,当文件对aa.txt进行循环的时候,因为没有指明条件所以对文件的每一行进行循环。当循环到第一行的时候,此时行号为1,所以NR的值为1, 打印1和本行内容($0),以此类推,直到把所有行全部打印完成为止。

FNR

FNR 表示当前正在处理的行号和NR的效果类似

也是上面的例子:

awk连载4: awk里的变量 

看到的效果是和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会分别计算每个文件的行数。

 

练习如下:

awk连载4: awk里的变量 

awk连载4: awk里的变量 

所以可以依据此来判断当前处理的是bb.txt还是cc.txt。

如果NR==FNR则处理的是前面的文件即bb.txt,如果NR!=FNR的话则处理的是后面的文件即cc.txt。

练习:

awk连载4: awk里的变量 

这里是当NR==FNR时及处理bb.txt文件的时候,打印行号及文件名

awk连载4: awk里的变量 

这里是当NR!=FNR时及处理cc.txt文件的时候,打印行号和文件名。

相关新闻

发表回复

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

                                                                                                                                    RHCE9学习指南连载,点击阅读