awk
awk 可以实现模糊查询,按需截取字符串,进行判断以及简单的运算
1)查询 搜索名字中含有zhang 和li 的学生成绩
命令 | 含义 |
awk '/搜索字符/' score.txt | 模糊查询 |
模糊查询 '张三' ‘张三三'
cat 4.txt | awk '/zhang|li/'
awk '/zhang|li/' 4.txt
[root@bigdata01 scripts]# grep 'zhang' 4.txt
zhangsan 68 99 26
[root@bigdata01 scripts]# grep 'li' 4.txt
lisi 98 66 96
zhaoliu 78 44 36
2、指定分隔符,按照下标显示内容
命令 | 含义 |
awk -F ',' '{print $1,$2, $3}' 文件 | 操作1.txt文件, 根据 逗号 分割, 打印 第一段 第二段 第三段 内容 |
选项
选项 | 英文 | 含义 |
-F ',' | field-separator | 使用 指定字符 分割 |
$ + 数字 | 获取第几段内容 | |
$0 | 获取 当前行 内容 | |
NF | field | 表示当前行共有多少个字段 |
$NF | 代表 最后一个字段 | |
$(NF-1) | 代表 倒数第二个字段 | |
NR | 代表 处理的是第几行 |
打印4.txt 中每个学生的姓名以及前两门的成绩
cat 4.txt | awk -F ' ' '{print $1,$2,$3}'
跟这个效果一样:
cut -d ' ' -f 1,2,3 4.txt
命令 | 含义 |
awk -F ' ' '{OFS="==="}{print $2, $3}' 1.txt | 操作1.txt文件, 将打印出来的内容添加分隔符 |
选项 | 英文 | 含义 |
OFS="字符" | output field separator | 向外输出时的段分割字符串 |
awk中使用函数
命令 | 含义 |
awk -F ',' '{print toupper($2)}' 1.txt | 操作1.txt文件, 将某一列的数据变为大写 |
常用函数如下:
函数名 | 含义 | 作用 |
toupper() | upper | 字符 转成 大写 |
tolower() | lower | 字符 转成小写 |
length() | length | 返回 字符长度 |
cat 4.txt | awk -F ' ' '{print toupper($1)}'
awk中还可以添加条件判断
cat 4.txt | awk -F ' ' '{if($4>60) print $1,$4}'
cat 4.txt | awk -F ' ' '{if($4>60) print $1,$4,"及格";else print $1,$4,"不及格"}'
awk -F ' ' '{if($2>=60) print "及格",$1,$2;else print "不及格",$1,$2}' 4.txt
awk中可以进行begin,end语句
命令 | 含义 |
awk 'BEGIN{初始化操作}{每行都执行} END{结束时操作}' 文件名 | BEGIN{ 这里面放的是执行前的语句 } {这里面放的是处理每一行时要执行的语句} END {这里面放的是处理完所有的行后要执行的语句 } |
//求最后一列成绩的总分
cat 4.txt | awk -F ' ' 'BEGIN{print "开始计算成绩总和"}{total=total+$4}END{print total}'
它是由三部分组成的
BEGIN{} 这一部分只执行一次
END{} 该代码块中的语句也只执行一次
中间{} 每读取一行数据,就执行一次
BEGIN 和 END 可以选择性的使用
// 获取记录条数:
cat 4.txt | awk -F ' ' 'BEGIN{print "开始计算成绩总和"}{total=total+$4}END{print total,NR}'
[root@bigdata01 scripts]# awk -F ' ' 'BEGIN{print "开始计算成绩:"}{total=total+$4}END{print "总成绩 是:"total",总条数是:"NR}' 4.txt
开始计算成绩:
总成绩是:356,总条数是:6
// 获取平均分
cat 4.txt | awk -F ' ' 'BEGIN{print "开始计算成绩总和"}{total=total+$4}END{print total,NR,(total/NR)}'
awk -F ' ' 'BEGIN{print "开始计算最后一个学科的总成绩"}{total=total+$4;print NR}END{print total/NR}' 4.txt
开始计算最后一个学科的总成绩
1
2
3
4
5
6
59.3333
[root@bigdata01 datas]# awk -F ' ' 'BEGIN{print "开始计算最后一个学科的总成绩"}{total=total+$4;print $0,NF,$NF}END{print total/NR}' 4.txt
开始计算最后一个学科的总成绩
zhangsan 68 99 26 4 26
lisi 98 66 96 4 96
wangwu 38 33 86 4 86
zhaoliu 78 44 36 4 36
maqi 88 22 66 4 66
zhouba 98 44 46 4 46
59.3333
$0 表示当前行的内容
NF 表示当前行有多少个字段
$NF 表示当前行的最后一个字段
[root@bigdata01 scripts]# awk -F ' ' '{print $0,NF,$NF}' 4.txt
zhangsan 68 99 26 4 26
lisi 98 66 96 4 96
wangwu 38 33 86 4 86
zhaoliu 78 44 36 4 36
maqi 88 22 66 4 66
zhouba 98 44 46 4 46