LINUX中详解AWK内建变量FS,NF,NR,RT,RS,ORS,OFS
看了网上好多关于AWK内建变量的文章,这里加上个人的理解和记忆,可以让大家掌握这些变量的基本用法。
FS指定字段un列分隔符(FontSpace)
[~/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指定输出字段列分隔符(OutputFontspace)
[~/AWK_learning]$echo"111222333"|awk'BEGIN{OFS="|";}{print$1,$2,$3}' 111|222|333
RS指定行分隔符默认分隔符为\n(RowSpace)
[~/AWK_learning]$echo"111222|333444|555666"|awk'BEGIN{RS="|"}{print$0}' 111222 333444 555666
ORS指定输出行分隔符
[~/AWK_learning]$awk'BEGIN{ORS="|";}{print$0;}'test.txt 111222|333444|555666
RT代指分隔符
[~/AWK_learning]$echo"111222|333444|555666"|awk'BEGIN{RS="|"}{print$0,RT}' 111222| 333444| 555666|
NF每行字段总数(NumberofFont)
[~/AWK_learning]$cattest.txt 111222 333444 555666 [~/AWK_learning]$awk'{printNF}'test.txt 2 2 2 [~/AWK_learning]$awk'{print$NF}'test.txt 222 444 666
NR当前行数(NumberofRow)
[~/AWK_learning]$cattest.txt 111222 333444 555666777 [~/AWK_learning]$awk'{printNR}'test.txt 1 2 3 [~/AWK_learning]$awk'{print$NR}'test.txt 111 444 777
下面我们在来看下,在内建变量执行中的相关问题:
NR表示从awk开始执行后,按照记录分隔符读取的数据次数,默认的记录分隔符为换行符,因此默认的就是读取的数据行数,NR可以理解为NumberofRecord的缩写。
在awk处理多个输入文件的时候,在处理完第一个文件后,NR并不会从1开始,而是继续累加,因此就出现了FNR,每当处理一个新文件的时候,FNR就从1开始计数,FNR可以理解为FileNumberofRecord。
NF表示目前的记录被分割的字段的数目,NF可以理解为NumberofField。
下面以示例程序来进行说明,首先准备两个输入文件class1和class2,记录了两个班级的成绩信息,内容分别如下所示:
CodingAnts@ubuntu:~/awk$catclass1 zhaoyun8587 guanyu8788 liubei9086 CodingAnts@ubuntu:~/awk$catclass2 caocao928790 guojia999692
现在要查看两个班级的所有成绩信息,并在每条信息前加上行号,则可以使用下面的awk指令;
CodingAnts@ubuntu:~/awk$awk'{printNR,$0}'class1class2 1zhaoyun8587 2guanyu8788 3liubei9086 4caocao928790 5guojia999692
这里的行号就是通过NR来实现的,awk每读取一条记录,NR的值便加一。如果要求每个班级的行号从头开始变化,则需要使用FNR来实现,如下:
CodingAnts@ubuntu:~/awk$awk'{printFNR,$0}'class1class2 1zhaoyun8587 2guanyu8788 3liubei9086 1caocao928790 2guojia999692