背景
linux中如果简单的查看文件内容 可以用cat命令
如果想对文件的内容做一些统计 awk 一个强大的文本处理语言,用于数据处理和统计
本文只是介绍一些简单的常用命令
awk常用命令
首先我们准备一个文本文件用来测试 Hello.txt
Hello xiaohong 1999
Hello xiao hong 1999
Hello xiaoming 1992
Hello xiao ming 1992
1. 直接输出文本文件的内容
awk '{print}' hello.txt
2.输出某一行
awk '{print $1}' hello.txt ($1代表第一行的意思 和print用空格隔开)
3.输出某几行
awk '{print $1,$2}' hello.txt $1和$2之间用逗号隔开
4. 把某几行对其打印
awk '{print $1" "$2" "$3" "$4}' hello.txt (把逗号换成 " ")
5. NR(number of record)行数和NF(number of field)列数的使用
5.1 awk '{print NR ,$0}' hello.txt (每一行打印出来 前面会加一个数字 表示第几行)
1 Hello xiaohong 1999
2 Hello xiao hong 1999
3 Hello xiaoming 1992
4 Hello xiao ming 1992
5.2 awk '{print NF ,$0}' hello.txt (每一行打印出来 前面会加一个数字 表示有几列 可以看出)
3 Hello xiaohong 1999
4 Hello xiao hong 1999
3 Hello xiaoming 1992
4 Hello xiao ming 1992
可以看出 awk默认以空格区分一共有几列
6. 筛选第四行是1992的内容
awk '$4==1992{print $0}' hello.txt ($0 指所有列)
如果第四列不是纯数字 需要用双引号 awk '$4=="1992"{print $0}' hello.txt
7. 输出某一行/列
awk 'NR==3{print $0}' hello.txt 打印第三行的内容
8. 更改awk的分隔符
awk 'BEGIN{FS=","}{print $1}' hello.txt (awk分隔符默认是空格 可以更改awk的分隔符)FS指的是输入分隔符,OFS输出分隔符
9. awk输出多个文件
awk '{print NR,$0}' hello.txt test.txt 会把 hello.txt和test.txt的内容一起打印出来(行号叠加)
10. awk如何隐藏一列
awk '{ $1="xxx";print $0}' hello.txt
第一列就会被指定xxx输出
11. awk打印最后一列
awk '{print $NF}' hello.txt awk '{print ($NF-1)}' hello.txt 打印倒数第二列
12. awk模糊匹配
把文档中含有999的打印出来
awk '/999/{print $0}' hello.txt 这里用到了正则表达式
13. 分组和汇总
Hello xiaohong 22 nan
Hello xiaozhang 22 nv
Hello xiaoming 23 nan
Hello xiaohei 24 nv
13.1 统计22岁的有多少人
awk '$3=="1999"{a+=1}END{print "1999",a}' hello.txt
13.2 按性别分组, 计算各组人数和年龄平均值
awk '{a[$4]+=1;b[$4]+=$3}END{for (i in a)print i, "人数:",a[i], "平均年龄:", b[i]/a[i]}' hello.txt
(b[i]是i in a的总年龄 i有nan和nv,a[i]是总人数,for (i in a)print i 遍历所有性别)
输出打印结果
nan 人数: 2 平均年龄: 22.5
nv 人数: 2 平均年龄: 23
参考知乎文章:https://zhuanlan.zhihu.com/p/61652727?utm_source=wechat_session
解释变量a b:awk '{a=1;b=3; print a + b}' awk可以声明变量并做计算(打印结果4)
任何在BEGIN之后列出的操作(在{}内)将在Unix awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。
因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果。