awk 的内置变量 NF、NR、FNR、FS、OFS、RS、ORS
NF 字段个数,(读取的列数)
NR 记录数(行号),从1开始,新的文件延续上面的计数,新文件不从1开始
FNR 读取文件的记录数(行号),从1开始,新的文件重新从1开始计数
FS 输入字段分隔符,默认是空格
OFS 输出字段分隔符 默认也是空格
RS 输入行分隔符,默认为换行符
ORS 输出行分隔符,默认为换行符
NF
读取记录的字段数(列数),例如:
[root@localhost test]# awk '{print "字段数:" NF}' test
字段数:4
字段数:4
字段数:3
字段数:4
字段数:4
[root@localhost test]# cat test
a aa aaa 1
b bb bbb 2
c cc ccc
d dd ddd 4
e ee eee 5
如上,awk在读取文件时,按行读取,每一行的字段数(列数),赋值给内置变量NF,打印出来的就是每行的字段总数,有以下简单示例:
[root@localhost test]# awk '{print $NF}' test
1
2
ccc
4
5
t@localhost test]# cat test
a aa aaa 1
b bb bbb 2
c cc ccc
d dd ddd 4
e ee eee 5
我们有需求,只需要最后一列的数据,由于每一行的列数不一,最后一列无法指定固定的列数,可以使用NF来表示列数 $NF 表示打印出等于总列数的那一列的数据,显而易见就是打印最后一列的数据
NR
读取文件的行数(在某些应用场景中可以当作行号来使用)
[root@localhost test]# awk '{print "行号为:" NR}' test
行号为:1
行号为:2
行号为:3
行号为:4
行号为:5
[root@localhost test]# cat test
a aa aaa 1
b bb bbb 2
c cc ccc
d dd ddd 4
e ee eee 5
如上,打印出读取文件的行数,因为是按行读取,在应用场景中,行数可以等同于行号,用来输出对应行的行号,NR 还可以用作判断输出,如下简单例子:
[root@localhost test]# awk '{if(NR>2)print "行号为:" NR }' test
行号为:3
行号为:4
行号为:5
判断当读取的行数(行号)大于2时,输出对应的内容。
FNR
也是读取文件的行数,但是和NR 不同的是当读取的文件有两个或两个以上时,NR 读取完一个文件,行数继续增加 而FNR 重新从1开始记录
[root@localhost test]# awk '{print "NR:" NR "FNR:" FNR}' test test2 test3
NR:1FNR:1
NR:2FNR:2
NR:3FNR:3
NR:4FNR:4
NR:5FNR:5
NR:6FNR:1
NR:7FNR:2
NR:8FNR:3
NR:9FNR:1
[root@localhost test]# cat test
a aa aaa 1
b bb bbb 2
c cc ccc
d dd ddd 4
e ee eee 5
[root@localhost test]# cat test2
! !! !!! 1
@ @@ @@@ 2
# ## ### 3
[root@localhost test]# cat test3
bbbbb nnnnn mmmm
如上,总共有三个文件,读取三个文件NR 从一开始一直增加,FNR 每读取到一个新的文件,行数重新从一开始增加,有一个有趣的应用,比较两个文件A,B是否一致,以A作为参考,不一致的输出行号
[root@localhost test]# awk '{if(NR==FNR){arry[NR]=$0}else{if(arry[FNR]!=$0){print FNR}}}' test test1
3
[root@localhost test]# cat test
a aa aaa 1
b bb bbb 2
c cc ccc
d dd ddd 4
e ee eee 5
[root@localhost test]# cat test1
a aa aaa 1
b bb bbb 2
c cc ccc 3
d dd ddd 4
e ee eee 5
解析:当读取第一个文件的A的时候NR 和 FNR 都是从1开始计数,这时NR==FNR
将行全部内容赋值给数组,当读取到第二个文件时,NR!=FNR
此时表示已读取到第二个文件,将的内容和$0进行比较如果不相同,则输出行号。
FS
输入字段分割符,默认是以空格为分隔符,在日常中常常文本里面不都以空格分隔,此时就要指定分割符来格式化输入。
[root@localhost test]# cat test4
a,b,c
d,e,f
g,h,i
j,k,l
[root@localhost test]# awk '{print $1}' test4
a,b,c
d,e,f
g,h,i
j,k,l
[root@localhost test]# awk 'BEGIN{FS=","}{print $1}' test4
a
d
g
j
以上,test4里面字母间是以“,” 来分割的,第一种写法,由于,没有指定FS,awk默认是以空格来分割,所以全部内容都当作$1来显示,第二个指定FS以“,”分割,所以能够正常打印。
OFS
输出字段分割符,默认为空格,如果读进来的数据是以空格分割,为了需求可能要求输出是以“-“分割,可以使用OFS进行格式化输出
[root@localhost test]# awk 'BEGIN{FS=" ";OFS="---"}{print $1,$2,$3}' test
a---aa---aaa
b---bb---bbb
c---cc---ccc
d---dd---ddd
e---ee---eee
RS
输入行分隔符,判断输入部分的行的起始位置,默认是换行符
[root@localhost test]# cat test4
a,b,c
d,e,f
g,h,i
j,k,l
[root@localhost test]# awk 'BEGIN{RS=","}{print}' test4
a
b
c
d
e
f
g
h
i
j
k
l
这里说明一下,RS=“,”将以,为分割当作一行,即a,b a被当作一行,b也被当作一行,但是细心的会发现以“,”分割c和d之间是没有“,“的为什么也当作一行了呢,是因为输入中c后面还有一个换行符\n 即,输入应该是a,b,c\n只不过\n我们看不到,输入中,a一行,b一行,c\nd一行但是输出的时候系统会将\n视为换行符,所以看上去c和d是两行,实际上是一行
ORS
输出行分割符,默认的是换行符,它的机制和OFS机制一样,对输出格式有要求时,可以进行格式化输出
[root@localhost test]# awk 'BEGIN{ORS=","}{print}' test4
a,b,c,d,e,f,g,h,i,j,k,l,
全部的分割符,都变成了”,“,具体的格式,可以根据实际需求,进行多种变化。
awk 的内置变量 NF、NR、FNR、FS、OFS、RS、ORS相关推荐
- awk NR详解!awk 的内置变量 NF、NR、FNR、FS、OFS、RS、ORS
NF 字段个数,(读取的列数) NR 记录数(行号),从1开始,新的文件延续上面的计数,新文件不从1开始 FNR 读取文件的记录数(行号),从1开始,新的文件重新从1开始计数 FS 输入字段分隔符,默 ...
- [Shell] awk FS,OFS,RS,ORS
FS :是列分隔符,默认是空格 OFS:是输出列的分隔符 RS :是行分隔符,默认是空格 ORS:是输出行的分隔符 [/]# echo "a b c d" | awk '{prin ...
- 命令 —— awk内置变量(NF,NR,FS,FILENAME)
关于awk命令的几个内置变量(NF,NR,FS,FILENAME) 1.NF:支持记录域个数,在记录被读之后再设置例1 [root@redhat wilsontest]# pwd /tmp/wilso ...
- 【Shell】awk命令--输出某列,列求和,列求平均值,列最大值,列去重复,取倒列,过滤行,匹配,不匹配,内置变量|定义分隔符|多个分隔符...
目录 awk基本语法 awk输出某几列 awk遍历文件行处理 awk中运行shell命令 方法1:awk 内置函数system 方法2 通过awk print 交给bash awk中运行shell命 ...
- 【Shell】awk命令--输出某列,列求和,列求平均值,列最大值,列去重复,取倒列,过滤行,匹配,不匹配,内置变量|定义分隔符|多个分隔符
目录 awk基本语法 awk输出某几列 awk遍历文件行处理 awk中运行shell命令 方法1:awk 内置函数system 方法2 通过awk print 交给bash awk中运行shell命 ...
- awk 内置变量与自定义变量
点击上方"生信科技爱好者",马上关注真爱,请置顶或星标 作者:ghostwu 原文:https://www.cnblogs.com/ghostwu/p/9085653.html A ...
- awk取文本列_awk命令结构/内置变量/获取文本某行或某列
awk脚本基本结构 awk 'BEGIN{ print "start" }pattern{ commands }END{ print "end" }' file ...
- linux awk 内置变量使用介绍
awk是个优秀文本处理工具,可以说是一门程序设计语言.下面是awk内置变量. 一.内置变量表 属性 说明 $0 当前记录(作为单个变量) $1~$n 当前记录的第n个字段,字段间由FS分隔 FS 输入 ...
- linux内置变量大全,(转)linux awk 内置变量使用介绍
awk是个优秀文本处理工具,可以说是一门程序设计语言.下面是awk内置变量. 一.内置变量表 属性 说明 $0 当前记录(作为单个变量) $1~$n 当前记录的第n个字段,字段间由FS分隔 FS 输入 ...
最新文章
- [SQL] 外卖系统数据库设计
- 网络带宽和速度测试windows和linux iperf工具
- Android7.0 PowerManagerService亮灭屏分析(二)
- Tomcat server launch debug - OrderAnalytics
- win7 蓝牙4.0 ble驱动_初识物联网无线通信技术之蓝牙4.0BLE协议栈
- 【EOS】EOS环境基础
- 【python】nonebot--QQ接口库
- 在线计算机性能测试,电脑性能检测
- java雪崩_了解java架构之微服务架构—雪崩效应
- python编辑器geany_另外一款编辑器 Geany
- csu-2018年11月月赛Round2-div1题解
- R语言里面“AsIs“到底是啥,用的时候咋处理
- js 数字金额的转换 (转)
- Android 几个ApplicationInfo Info系列类的总结
- Win10安装cuda11.1和cudnn8.0
- 黑帽seo 模板生成php,全自动无限生成关键词页面(黑帽SEO优化终极方法)
- 淘宝Buy+负责人胡晓航:从技术和产品维度看Buy+ VR购物
- 线程池的shutdown()与shutdownNow()方法的区别
- slide-view 微信小程序官方左滑删除组件
- 考研复试英文自我介绍模板(学长已上岸)