LINUX中详解AWK内建变量FS,NF,NR,RT,RS,ORS,OFS
看了网上好多关于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
上一篇: Nginx服务器下防盗链的方法介绍
下一篇: 提升外链SEO优化效果的几点策略