欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

LINUX中详解AWK内建变量FS,NF,NR,RT,RS,ORS,OFS

程序员文章站 2023-11-19 15:40:28
看了网上好多关于awk内建变量的文章,这里加上个人的理解和记忆,可以让大家掌握这些变量的基本用法。 fs 指定字段un列分隔符(font space) [~/a...

看了网上好多关于awk内建变量的文章,这里加上个人的理解和记忆,可以让大家掌握这些变量的基本用法。

fs 指定字段un列分隔符(font space)

[~/awk_learning]$ echo "111|222|333" | awk '{print $1}'
111|222|333
[~/awk_learning]$ echo "111|222|333" | awk 'begin{fs="|"}{print $1}'
111

ofs 指定输出字段列分隔符(output font space)

[~/awk_learning]$ echo "111 222 333" |awk 'begin{ofs="|";}{print $1,$2,$3}'
111|222|333

rs指定行分隔符 默认分隔符为\n(row space)

[~/awk_learning]$ echo "111 222|333 444|555 666" | awk 'begin{rs="|"}{print $0}'
111 222
333 444
555 666

ors指定输出行分隔符

[~/awk_learning]$ awk 'begin{ors="|";}{print $0;}' test.txt
111 222|333 444|555 666

rt 代指分隔符

[~/awk_learning]$ echo "111 222|333 444|555 666" | awk 'begin{rs="|"}{print $0,rt}'
111 222 |
333 444 |
555 666 |

nf 每行字段总数(number of font)

[~/awk_learning]$ cat test.txt
111 222
333 444
555 666
[~/awk_learning]$ awk '{print nf}' test.txt
2
2
2
[~/awk_learning]$ awk '{print $nf}' test.txt
222
444
666

nr 当前行数(number of row)

[~/awk_learning]$ cat test.txt
111 222
333 444
555 666 777
[~/awk_learning]$ awk '{print nr}' test.txt
1
2
3
[~/awk_learning]$ awk '{print $nr}' test.txt
111
444
777

下面我们在来看下,在内建变量执行中的相关问题:

nr表示从awk开始执行后,按照记录分隔符读取的数据次数,默认的记录分隔符为换行符,因此默认的就是读取的数据行数,nr可以理解为number of record的缩写。

在awk处理多个输入文件的时候,在处理完第一个文件后,nr并不会从1开始,而是继续累加,因此就出现了fnr,每当处理一个新文件的时候,fnr就从1开始计数,fnr可以理解为file number of record。

  nf表示目前的记录被分割的字段的数目,nf可以理解为number of field。

下面以示例程序来进行说明,首先准备两个输入文件class1和class2,记录了两个班级的成绩信息,内容分别如下所示:

codingants@ubuntu:~/awk$ cat class1
zhaoyun 85 87
guanyu 87 88
liubei 90 86
codingants@ubuntu:~/awk$ cat class2
caocao 92 87 90
guojia 99 96 92

现在要查看两个班级的所有成绩信息,并在每条信息前加上行号,则可以使用下面的awk指令;

codingants@ubuntu:~/awk$ awk '{print nr,$0}' class1 class2
1 zhaoyun 85 87
2 guanyu 87 88
3 liubei 90 86
4 caocao 92 87 90
5 guojia 99 96 92

这里的行号就是通过nr来实现的,awk每读取一条记录,nr的值便加一。如果要求每个班级的行号从头开始变化,则需要使用fnr来实现,如下:

codingants@ubuntu:~/awk$ awk '{print fnr,$0}' class1 class2
1 zhaoyun 85 87
2 guanyu 87 88
3 liubei 90 86
1 caocao 92 87 90
2 guojia 99 96 92