AWK实战指南:模糊查询、字段提取与BEGIN/END语句

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值