关于awk的视频教程,强烈推荐观看B站大神录制的:awk入门教程
测试数据(一个学生信息表)
小红 女 一年级 北京 优秀 小花 女 一年级 上海 差 小明 男 三年级 北京 优秀 小可 女 一年级 重庆 良好 小林 男 一年级 重庆 优秀 小飞 男 二年级 广东 一般 小波 男 一年级 杭州 优秀 小康 男 四年级 深圳 一般 小雷 男 一年级 福建 良好 小冰 女 五年级 北京 优秀
原样打印内容
→ ~ $ awk '{print}' data.txt 小红 女 一年级 北京 优秀 小花 女 一年级 上海 差 小明 男 三年级 北京 优秀 小可 女 一年级 重庆 良好 小林 男 一年级 重庆 优秀 小飞 男 二年级 广东 一般 小波 男 一年级 杭州 优秀 小康 男 四年级 深圳 一般 小雷 男 一年级 福建 良好 小冰 女 五年级 北京 优秀
打印第一列
→ ~ $ awk '{print $1}' data.txt 小红 小花 小明 小可 小林 小飞 小波 小康 小雷 小冰
打印第二列和第四列
→ ~ $ awk '{print $2,$4}' data.txt 女 北京 女 上海 男 北京 女 重庆 男 重庆 男 广东 男 杭州 男 深圳 男 福建 女 北京
注意$0表示一整行的所有列
打印多列,并指定中间连接符号
就是在打印的地方加连接符号就行,每一列的$n 中间的符号要使用双引号阔以来。
awk中,分隔符(或者一些字符串内容)可以和列中间,可以使用逗号分隔,此时,真实的作用效果是空格。也可以使用空格分隔,但此时的作用效果是连接(中间没有空格)
→ ~ $ awk '{print $2,"-",$4,"->",$5}' data.txt #因为使用的是逗号分隔,所有中间分隔符两边都有空格 女 - 北京 -> 优秀 女 - 上海 -> 差 男 - 北京 -> 优秀 女 - 重庆 -> 良好 男 - 重庆 -> 优秀 男 - 广东 -> 一般 男 - 杭州 -> 优秀 男 - 深圳 -> 一般 男 - 福建 -> 良好 女 - 北京 -> 优秀 → ~ $ awk '{print $2 "-" $4 "\t" $5}' data.txt #因为使用空格分隔,被认为是连接操作,所以,结果中的连接符两边没有空格 女-北京 优秀 女-上海 差 男-北京 优秀 女-重庆 良好 男-重庆 优秀 男-广东 一般 男-杭州 优秀 男-深圳 一般 男-福建 良好 女-北京 优秀
NR显示行号
NR number of rows(result)
→ ~ $ awk '{print NR,$2,$4,$5}' data.txt 1 女 北京 优秀 2 女 上海 差 3 男 北京 优秀 4 女 重庆 良好 5 男 重庆 优秀 6 男 广东 一般 7 男 杭州 优秀 8 男 深圳 一般 9 男 福建 良好 10 女 北京 优秀
NF显示列数
number Of fields
→ ~ $ awk '{print NF,$0}' data.txt 5 小红 女 一年级 北京 优秀 5 小花 女 一年级 上海 差 5 小明 男 三年级 北京 优秀 5 小可 女 一年级 重庆 良好 5 小林 男 一年级 重庆 优秀 5 小飞 男 二年级 广东 一般 5 小波 男 一年级 杭州 优秀 5 小康 男 四年级 深圳 一般 5 小雷 男 一年级 福建 良好 5 小冰 女 五年级 北京 优秀
因为awk中默认使用空格分割列,所以当咱们认为的一列会被awk认为是多列,比如地点:北京 海淀 西二旗,我们通常认为他是一列,但是awk会认为是3列。
查找数据
查找第四列值为北京的记录。注意awk使用空格分割,所以比较之前,先确定比较的列是否正确。
→ ~ $ awk '$4=="北京"{ print $0}' data.txt #北京要使用双引号括起来,否则会被认为是变量 小红 女 一年级 北京 优秀 小明 男 三年级 北京 优秀 小冰 女 五年级 北京 优秀 → ~ $ awk '$4=="北京" && $2=="男"{ print $0}' data.txt #并列关系 小明 男 三年级 北京 优秀 → ~ $ awk '$4=="北京" || $2=="男"{ print $0}' data.txt #或关系 小红 女 一年级 北京 优秀 小明 男 三年级 北京 优秀 小林 男 一年级 重庆 优秀 小飞 男 二年级 广东 一般 小波 男 一年级 杭州 优秀 小康 男 四年级 深圳 一般 小雷 男 一年级 福建 良好 小冰 女 五年级 北京 优秀