awk简单使用『摘.非原创』
1 awk简介
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。blabla一堆,好处多多。
2 awk写在前面的话
awk脚本要注意两个关键字BEGIN和END。
BEGIN:放的是执行前的语句;END:这里面放的是处理完所有的行后要执行的语句
3 awk常用环境变量
记录---awk把每一个以换行符结束的行称为一个记录
域---记录中的每个单词称做域
NF---当前记录中的字段数,即当前行的列数
NR---当前记录数,即当前文件行数
FS---输入域分隔符,默认为一个空格,-F 相当于内置分隔符
RS---输入记录的分隔符
$---字段引用
$n---当前记录的第n个字段,字段间由FS分割
$0---完整的输入记录,即一行
FILENAME---当前文件名
~/~!---匹配正则表达式和不匹配正则表达式
in---数组中的是否存在某键值
4 awk常用操作
awk '{[pattern] action}' {filenames}
按空格或TAB分割,输出文本1,4项: awk '{print $1,$4}' log.txt
awk -F # -F相当于内置变量FS,指定#为分割字符: awk -F a 'print $1,$4' log.txt 或 awk 'BEGIN{FS="a"}{print $1,$4}' log.txt
awk -v #设置变量: awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
忽略大小写:awk 'BEGIN{IGNORECASE=1} /MYWORD/' log.txt
awk的for循环和if语句与各语言常用相同
5 awk 关联数组
大部分内容摘自:http://www.cnblogs.com/chengmo/archive/2010/10/08/1846190.html
使用时注意awk版本,不同版本的函数不一定相同 awk --version 3.1.7
先说一下split函数:切分字符串并放到数组中;split有3个参数,第一个传要切分的字符串,第二个放切分完后输出的数组,第三个定义分隔符。
1) length
awk 'BEGIN{info="it is a test";lens=split(info,tA," ");print length(tA),lens;}':将info字符串按空格分隔放入数组tA,length获取数组长度
2) 输出数组内容
无序:awk 'BEGIN{info="it is a test";split(info,tA," ");for(k in tA){print k,tA[k];}}':for...in 输出,关联数组默认是无序的,注意k为数组下标(1,2,3,4)
有序:awk 'BEGIN{info="it is a test";tlen=split(info,tA," ");for(k=1;k<=tlen;k++){print k,tA[k]}}'
3) 判断键值存在
错误:awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";if(tB["c"]!="1"){print "no found";};for(k in tB){print k,tB[k];}}':注意awk数组是关联数组,只要通过数组引用它的key,就会自动创建该序列
正确:awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";if( "c" in tB){print "ok";};for(k in tB){print k,tB[k];}}' :通过if(key in array) 通过判断数组中是否包含”key”键值
4) 删除键值 :delete array[key]以删除,对应数组key的序列值
awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";delete tB["a"];for(k in tB){print k,tB[k]}}'
5) 二维数组(多维数组的使用)
awk的多维数组在本质上是一维数组,更确切一点,awk在存储上并不支持多维数组,awk提供了逻辑上模拟二维数组的访问方式。例如,array[2,4]=1这样的访问是允许的。awk使用一个特殊字符串SUBSEP(\034)作为分割字符,在上面的例子中,关联数组array存储的键值实际上是2\0344.如array[1,2,3]存储的为1\0342\0343
用法1 成员测试,可使用if((i,j) in array),注意下标需要在圆括号内
用法2 循环访问,使用for(item in array)来遍历数组。多维数组必须使用split()函数来访问单独的下标分量。split(item,subscr,SUBSEP)
注:可以用多维数组来编写乘法表
6 常见题目
A 统计文件中出现次数>5的单词并打印: awk '{for(i=1;i<=NF;i++)a[$i]++}END{for(i in a){if(a[i]>=5){print i"="a[i]}}}' log.txt
解析:for(i=;i<=NF;i++)a[$i]++:NF为当前行列数,该循环遍历每行的每个字段;将字段值作为下标写入数组a,获取其在文件中的出现次数a[$i]。
END表示文件读完了
for(i in a){if(a[i]>=){print i"="a[i]}: i in a ,即遍历数组a,如果a[i]>=,那么打印出该字段及其出现次数.
B 打印九九乘法表:seq |sed 'H;g'|awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s",i,NR,i*NR,i==NR?"\n":"\t")}'
解析:seq |sed 'H;g':打印了1 ... .. 九个模块,作为乘法表每行的被乘数,具体呵呵哒,我还需要进步
-v RS='':RS='' (以空行切分记录) 作为读取记录的分隔符,那么awk 每次就会读入一个分块了,而不是默认的一行。FS 使用\n 可以对读取的分块按行划分。
for(i=;i<=NF;i++):NF为读入块的列数(从1到9)分别打印
"%dx%d=%d%s",i,NR,i*NR:打印第n次读入块的乘法口诀,NR固定为行数,作为乘数。%d%s中d%最为积,s%为分隔符
i==NR?"\n":"\t"):?:三目运算符,判断当前公式为n*n,则换行,否则tab分割。\n和\t作用与s%的内容
C 统计平均值(针对不同文件类型):awk '{a[$1]+=$2;b[$1]++};END{for(i in a)print i,a[i]/b[i],a[i]}' file.txt(#每个成绩项为一行)或
awk '{for(i=2;i<=NF;i++){a[$1]+=$i;b[$1]++}}END{for(i in a) print i,a[i]/b[i],a[i]}' file.txt(#每行有若干列成绩)
上面太糙了,嘤嘤嘤。看下面这个:awk 'BEGIN{print "name average total"}{a[$1]+=$2;b[$1]++};END{for(i in a)print i"\t"a[i]/b[i]"\t"a[i]}' average.txt|column -t|sort -n -k -r
解析:print i"\t"a[i]/b[i]"\t"a[i] :以tab分隔符为分割打印值
column -t:转换为其为表格形式;
sort -n -k 2 -r:排序 -n 依照数值的大小排序; -k 选择以哪个区间进行排序2为第二列的值; -r 以相反的顺序来排序
结果: name average total
zhangsan 85 255
lisi 87.1667 261.5
wangwu 92.6667 278
D 假如把2列和3列的值作为新的第5列,第5列的平均值为avg5,求第5列中大于avg5的行数。(注意是行数)
awk '{a[NR]=$2+$3;sum+=a[NR]}END{avg=sum/NR;for(i in a){if(a[i]>avg)num++}print num}' log.txt 解析:前期读取文件,NR为变量,从1~文本行数,获取二三列的和存到数组中,并记录总和,方便之后计算平均值;
for(i in a){if(a[i]>avg)num++:遍历数组a,寻找大于avg的值并记录个数,注意如果这样打印a[i]的话是无序的,需要使用i=1;i<NR;i++,为有序的。
E 删除行内与第一列字符重复的字符:
- awk '{a=$1;gsub(" ?"a,"");print a""$0}' log.txt
解析:不用函数,只分析数组好难写,还是函数比较好。
a b c a d a
s d d d x s a
h j s a s h j h
j d f j a s j k j
F 若第一列相同,则合并两个文件的第三列到一个文件中
awk 'ARGIND==1{id[$1];value1[$1]=$3}ARGIND==2{id[$1];value2[$1]=$3}END{for(i in id){print i"\t"value1[i]"\t"value2[i]}}' file1 file2 > output
比如 file1 A
B
file2 A
C
合并后第三列到同一行 file A
B
C
awk简单使用『摘.非原创』的更多相关文章
- 『Python基础-10』字典
# 『Python基础-10』字典 目录: 1.字典基本概念 2.字典键(key)的特性 3.字典的创建 4-7.字典的增删改查 8.遍历字典 1. 字典的基本概念 字典一种key - value 的 ...
- 『Python基础-6』if语句, if-else语句
# 『Python基础-6』if语句, if-else语句 目录: 条件测试 if语句 if-else语句 1. 条件测试 每条if语句的核心都是一个值为True或False的表达式,这种表达式被称为 ...
- 『Python基础-4』字符串
# 『Python基础-4』字符串 目录 1.什么是字符串 2.修改字符串 2.1 修改字符串大小 2.2 合并(拼接)字符串 2.3 使用乘号'*'来实现字符串的叠加效果. 2.4 在字符串中添加空 ...
- js实现『加载更多』功能实例
DEMO : 滚动加载示例 关于如何实现『加载更多』功能,网上有插件可用,例如比较著名的使用iscroll.js实现的上拉加载更多.下拉刷新功能. 但实际用起来却是很麻烦.由于是第三方插件,要按照对方 ...
- 『Asp.Net 组件』Asp.Net 服务器组件 内嵌JS:让自己的控件动起来
代码: using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace ...
- 『Asp.Net 组件』第一个 Asp.Net 服务器组件:自己的文本框控件
代码: using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace DemoWebControl ...
- 『Asp.Net 组件』Asp.Net 服务器组件 的开发优势和劣势
在写<Asp.Net 服务器组件系列文档>之前,笔者不才,揣测微软战略用意: 微软利益诉求莫过于 微软产品和技术的市场份额: 因此,微软战略之一莫过于将 所有开发人员 团聚在 微软周围,以 ...
- 2018-2019-2 20165225『网络对抗技术』Exp2:后门原理与实践
2018-2019-2 20165225『网络对抗技术』Exp2:后门原理与实践 一.实验说明 任务一:使用netcat获取主机操作Shell,cron启动 (0.5分) 任务二:使用socat获取主 ...
- 2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践
2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践 一 免杀原理与实践说明 (一).实验说明 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件, ...
随机推荐
- lintcode:anagrams 乱序字符串
题目 乱序字符串 给出一个字符串数组S,找到其中所有的乱序字符串(Anagram).如果一个字符串是乱序字符串,那么他存在一个字母集合相同,但顺序不同的字符串也在S中. 您在真实的面试中是否遇到过这个 ...
- *[codility]MaxDoubleSliceSum
https://codility.com/demo/take-sample-test/max_double_slice_sum 两个最大子段和相拼接,从前和从后都扫一遍.注意其中一段可以为0.还有最后 ...
- nginx/apache/php隐藏http头部版本信息的实现方法
有时候我们需要隐藏我们的服务器版本信息,防止有心人士的研究,更安全,这里介绍下在nginx/apache/php中如何隐藏http头部版本信息的方法. nginx隐藏头部版本信息方法 编辑nginx. ...
- Linux中断处理体系结构分析
Linux中断处理体系结构分析(一) 异常,就是可以打断CPU正常运行流程的一些事情,比如外部中断.未定义指令.试图修改只读的数据.执行swi指令(Software Interrupt Instruc ...
- React如何性能调优
一. 二.调优例子 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=&q ...
- Android:利用SharedPreferences实现自动登录
主要代码: public class LoginActivity extends Activity { private EditText username; private EditText user ...
- Linux 动画显示
Linux最强大的一个特征就是它有大量的各种小命令工具,这也可以称做是它最有趣的一个地方了.在这些大量的有用的命令和脚本中,你会发现有少部 分命令工具不那么有用的——如果你不愿意说是完全没用处的话.你 ...
- ArcGIS 10 影像去黑边
在作卫片执法项目中,需要多个影像叠加截图,这就会出现影像黑边叠加的情况,这时就需要对多幅影像进行处理.主要有两种处理方式:以ArcGIS10.1为例,操作如下: 1.acrtoolbox——& ...
- smartcomb:用php实现的web模块拼合器
smartcomb是一个用php实现的web模块拼合器,相对于其他的代码拼合工具,如下特性: 可以拼合任意类型的文件,不限于js文件. 集中并声明依赖,自动分析依赖拼合,按需加载. 支持多种配置切换 ...
- java知识积累——单元测试和JUnit(二)
首先来复习一下几个重要知识点,然后接着进行一些介绍.在上一篇文章中,我曾经贴过下面这张图片: 在Which method stubs would you like to create?这里,现在结合4 ...