简明awk教程(Simple awk tutorial)
整理翻译。原文地址:http://www.hcs.harvard.edu/~dholland/computers/awk.html
简明awk教程
- 为什么选awk?
awk小巧、快速、简单。awk语言简练,像C。它用来进行文本处理,非常方便。
- awk能用来干嘛?
awk设计用来处理基于“列”构成的文本数据,例如表格。变量$1,$2..代表输入数据的第1、2..列。例如,要打印一个文件的第2列,你可以:
awk < file '{print $2}'
这句是说“对于每一行,打印第2列”。
同时还要打出第3列,你可以:
awk < file '{print $2,$3}'
- 输入分割符
默认情况下,awk用空白符(空格、Tab)来分割输入数据。你可以使用 -F 参数来制定分割符。举个例子,打印linux中每个用户的主目录,你可以:
awk < /etc/passwd -F: '{print $6}'
passwd文件中,每个用户的各种信息是用冒号来分割,而第6个是用户主目录。
- 数学运算
awk不强调变量的类型。变量根据被引用情况,要么是字符串,要么是数值。所有数值变量都是浮点型。以下实现华氏向摄氏的计算:
awk '{print ($1-32)*(5/9)}'
这句话将一直处理标准输入的数值,直到被终止。
运算符和C语言中的使用差不多。相邻的字符串变量即可拼接,而 ‘+’则总表示数值上的加法。因此:
echo 5 4 | awk '{print $1+$2}'
输出 9,而
echo 5 4 | awk '{print $1 $2}'
输出 54。需要注意的是
echo 5 4 | awk '{print $1,$2}'
输出 5 4。(5和4中间有空格)
- 变量
awk有一些内建的变量,$1、$2已经提到。同样对初学者很有用的变量是NF,它给出总列数(这样的话,$NF就表示最后一列)。$0表示所有输入数据。
你也可以创建变量,但不需要声明它们。没显式赋值的字符串初值是"",数值则是0。
举个例子,下面这句打印出了每行数据的平均数:
awk '{tot=0; for(i=1;i<=NF;i++) tot+=$i; print tot/NF;}'
需要注意的是,这里$i获得第i个数据,for循环则很像C语言。这里给tot赋0值是为了处理每行前重置,不把上一行的处理结果带入计算中。
- 语句块
若是每行一个数据,又该怎么计算他们的平均数呢?你可这么做:
awk '{tot+=$1; n+=1;} END {print tot/n;}'
上面两个语句块之间的“END”表明紧随其后的语句块要在所有行数据处理完毕之后才执行。类似的,如果语句块前出现条件语句,条件成立方可执行。如:
awk '$1==0 { pirnt $2}'
这句是说,当第1列数据为0时,打印出第2列。还有,你可以使用正则表达式:
awk '/^test/ {print $2}'
总之,语句块前,如果没有任何表达式,那么它总要执行;如果条件成立,那么它也执行;需要说明的是,没有特别干脆的方法,能实现选择各语句块中的一个去执行。
“BEGIN”和“END”一样,是个特殊的块语句执行条件,它指明在所有数据处理前执行。
- 其他语言结构
awk支持类似C语言的循环和条件语句:for,while,do/while,if,和 if/else。
- printf
awk中printf同C语言中功能相似。因此,它可以用来漂亮地输出、复杂地打印。(前面的print 会自动在输出结果后加上换行;printf不会。)
下面的例子用来删去第1列:
awk '{for(i=2; i<=NF; i++) printf "%s ", $i; printf "\n";}'
- 配合其他工具
脚本语言的好处在于可以轻松配合其他工具使用。一些工具很容易通过管道使用awk进行后续处理。awk也多与sed一起组合,用于正则的匹配和替换。
同sed, sort, paste等工具一起使用之后,awk在数据处理方面得心应手,在列表格式的数据库维护方面也相当不错。
别用csh,用sh或者ksh。
如何查看你使用频率最高的linux命令:
history | awk '{CMD[$2]++;count++;} END { for (a in CMD )print CMD[ a ]" " CMD[ a ]/count*100 "% " a }'| grep -v "./"| column -c3 -s " "-t |sort -nr | nl | head -n10
- 再说一些
这个教程相当简单、基础,awk其实可以做许多有用的事。man手册页中关于awk的部分是很好的参考。
简明awk教程(Simple awk tutorial)的更多相关文章
- 【译】 AWK教程指南
前面的话: 这几天写了一个程序,在同一个目录里生成了很多文件,需要统计其中部分文件的总大小,发现经常用到的ls.du等命令都无济于事,我甚至都想到了最笨的方法,写一个脚本:mkdir一个新目录,把要统 ...
- 【译】 AWK教程指南 9读取命令行上的参数
大部分的应用程序都允许使用者在命令之后增加一些选择性的参数.执行awk时这些参数大部分用于指定数据文件文件名,有时希望在程序中能从命令行上得到一些其它用途的数据.本小节中将叙述如何在awk程序中取用这 ...
- 【译】 AWK教程指南 7AWK应用实例
本节将示范一个统计上班到达时间及迟到次数的程序. 这程序每日被执行时将读入两个数据文件: * 员工当日到班时间的数据文件 ( 如下列的 arr.dat ) * 存放员工当月迟到累计次数的文件 当程序执 ...
- 【译】 AWK教程指南 6在AWK程序中使用Shell命令
awk程序中允许调用Shell指令,并提供管道解决awk与系统间数据传递的问题.所以awk很容易使用系统资源,读者可利用这个特点来编写某些适用的系统工具. 范例:写一个awk程序来打印出线上人数. 将 ...
- 【译】 AWK教程指南 5AWK中的数组
awk程序中允许使用字符串当做数组的下标(index).利用这个特色十分有助于资料统计工作.(使用字符串当下标的数组称为Associative Array) 首先建立一个数据文件,并取名为 reg.d ...
- 【译】 AWK教程指南 4通过文本内容和对比选择指定的记录
Pattern { Action }为awk中最主要的语法.若某Pattern的值为真则执行它后面的 Action. awk中常使用"关系表达式" (Relational Expr ...
- 【译】 AWK教程指南 3计算并打印文件中指定的字段数据
awk 处理数据时,它会自动从数据文件中一次读取一条记录,并会将该记录切分成一个个的字段:程序中可使用 $1, $2,... 直接取得各个字段的内容.这个特色让使用者易于用 awk 编写 reform ...
- 技能篇:awk教程-linux命令
前言 AWK是一门解释型的编程语言.用于文本处理,它的名字来源于它的三位作者的姓氏:Alfred Aho, Peter Weinberger 和 Brian Kernighan awk 程序结构 运行 ...
- 《简明python教程》笔记一
读<简明Python教程>笔记: 本书的官方网站是www.byteofpython.info 安装就不说了,网上很多,这里就记录下我在安装时的问题,首先到python官网下载,选好安装路 ...
随机推荐
- charles本地调试之map和rewrite功能
charles是一款mac下代理调试工具,对于前端开发同学来说是相当方便的一个调试接口的工具:不过charles需要收费,不过在天朝几乎收费的软件都能找到破解方法: 使用charles前,需要将cha ...
- Verilog HDL小练习
5s内15Hz4个LED闪烁,再两秒熄灭,循环往复. 引入en,可以使得4个LED灯全亮,以及恢复周期变化. module led(clk_27MHZ, en, led1, led2, led3, l ...
- linux kernel notifier chain(事件通知链)
Linux内核中各个子系统相互依赖,当其中某个子系统状态发生改变时,就必须使用一定的机制告知使用其服务的其他子系统,以便其他子系统采取相应的措施.为满足这样的需求,内核实现了事件通知链机制(notif ...
- service 设计问题
今天写了一段让自己尴尬的代码,就是在一个方法中调用了两个 service 方法,而我为每个service 都定义了 事物回滚. 然后郁闷了,我执行请求调用该方法, 发现第二个service方法执行失败 ...
- 【Mybatis】MyBatis配置文件的使用(二)
本例在[Mybatis]MyBatis快速入门(一)基础上继续学习XML映射配置文件 MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置(settings)和属性(properti ...
- CSS3美化网页!!
一.span标签:能让某几个文字或者某个词语凸显出来 <p> 今天是11月份的<span>第一天</span>,地铁卡不打折了 ...
- Nodejs之路:异步I/O的过程
对于Node中的异步I/O调用,从发出调用到回调执行,看起来像普通的js异步,但是流程却和普通js那些消息队列完全不同,整个过程经历了哪些? 下面以Windows平台下为例: 一,异步调用第一阶段: ...
- AngularJS封装webupload实现文件夹上传
百度的webupload没有开放api获取整个文件夹的信息.本文是二次开发webupload实现获取文件夹信息. 指令封装 /** * @license lx.ui.framework v1.0.0 ...
- Javascript上传超大文件实例
因业务需求需要向伺服器上传大于1GB以上的视频文件,其实网上也能找到很多大文件上传的第三方组件,问题是要么用起来相当不方便,总出现一些bug,要么收费太贵(费用几千,甚至还限定使用数量),最终自己开发 ...
- PostgreSQL与PostGIS的关系
PostgreSQL相当于PostGIS的祖先,PostGIS是在PostgreSQL的基础上发展起来的,从它们的名字上也能看出些许端倪.PostgreSQL是一个开源数据库,而PostGIS在此基础 ...