整理翻译。原文地址: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)的更多相关文章

  1. 【译】 AWK教程指南

    前面的话: 这几天写了一个程序,在同一个目录里生成了很多文件,需要统计其中部分文件的总大小,发现经常用到的ls.du等命令都无济于事,我甚至都想到了最笨的方法,写一个脚本:mkdir一个新目录,把要统 ...

  2. 【译】 AWK教程指南 9读取命令行上的参数

    大部分的应用程序都允许使用者在命令之后增加一些选择性的参数.执行awk时这些参数大部分用于指定数据文件文件名,有时希望在程序中能从命令行上得到一些其它用途的数据.本小节中将叙述如何在awk程序中取用这 ...

  3. 【译】 AWK教程指南 7AWK应用实例

    本节将示范一个统计上班到达时间及迟到次数的程序. 这程序每日被执行时将读入两个数据文件: * 员工当日到班时间的数据文件 ( 如下列的 arr.dat ) * 存放员工当月迟到累计次数的文件 当程序执 ...

  4. 【译】 AWK教程指南 6在AWK程序中使用Shell命令

    awk程序中允许调用Shell指令,并提供管道解决awk与系统间数据传递的问题.所以awk很容易使用系统资源,读者可利用这个特点来编写某些适用的系统工具. 范例:写一个awk程序来打印出线上人数. 将 ...

  5. 【译】 AWK教程指南 5AWK中的数组

    awk程序中允许使用字符串当做数组的下标(index).利用这个特色十分有助于资料统计工作.(使用字符串当下标的数组称为Associative Array) 首先建立一个数据文件,并取名为 reg.d ...

  6. 【译】 AWK教程指南 4通过文本内容和对比选择指定的记录

    Pattern { Action }为awk中最主要的语法.若某Pattern的值为真则执行它后面的 Action. awk中常使用"关系表达式" (Relational Expr ...

  7. 【译】 AWK教程指南 3计算并打印文件中指定的字段数据

    awk 处理数据时,它会自动从数据文件中一次读取一条记录,并会将该记录切分成一个个的字段:程序中可使用 $1, $2,... 直接取得各个字段的内容.这个特色让使用者易于用 awk 编写 reform ...

  8. 技能篇:awk教程-linux命令

    前言 AWK是一门解释型的编程语言.用于文本处理,它的名字来源于它的三位作者的姓氏:Alfred Aho, Peter Weinberger 和 Brian Kernighan awk 程序结构 运行 ...

  9. 《简明python教程》笔记一

    读<简明Python教程>笔记: 本书的官方网站是www.byteofpython.info  安装就不说了,网上很多,这里就记录下我在安装时的问题,首先到python官网下载,选好安装路 ...

随机推荐

  1. centos free详解

    CentOS 6及以前 $ free total used free shared buffers cached Mem: 4040360 4012200 28160 0 176628 3571348 ...

  2. 设置DataGridView中表头颜色

    默认的DataGridView表头颜色实在不是太好看,想设置下,上google搜了一通, 都说这样设置 this.dataGridView1.ColumnHeadersDefaultCellStyle ...

  3. linux 查看信息-磁盘分区&网络

    磁盘和分区 1.查看挂接的分区状态 2.查看所有交换分区 3.查看启动时IDE设备检测状况 网络 1.查看网络接口属性 2.查看防火墙设置 3.查看路由表 4.查看所有监听端口 5.查看所有已经建立的 ...

  4. Chapter3_操作符_其他操作符

    对java中其他操作符及一些注意事项的总结 (1)按位操作符 按位操作符操作基本整数类型中的单个二进制位,有与(&),或(|),非(~).按位操作符还可以和等号(=)联合使用,如~=,& ...

  5. JSP请求重定向与请求转发的区别

    请求重定向 客户端行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次请求对象不会保存,地址栏URL会改变: 请求转发 服务器行为,request.getReques ...

  6. pip更换国内源

    学习Python开发,据说pip是很好用的一个Python包管理工具,于是尝试使用,但源异常慢,于是切换至国内的源(清华源). 在~/.pip/pip.conf (如果没有此文件则自行新建) 内容 [ ...

  7. pop

    package com.example.hellopopupwindow; import android.os.Bundle; import android.app.Activity; import ...

  8. Codeforces791 C. Bear and Different Names

    C. Bear and Different Names time limit per test 1 second memory limit per test 256 megabytes input s ...

  9. verilog HDL -模块代码基本结构

    1--verilog HDL 语言的预编译指令作用:指示在编译verliog HDL源代码前,需要执行哪些操作. 2--模块内容是嵌在module 和endmodule两个语句之间.每个模块实现特定的 ...

  10. Itween的代码使用方法 - 01

    BB:Itween是真心不好用! - 透明度动画 void Start () { //键值对儿的形式保存iTween所用到的参数 Hashtable args = new Hashtable(); / ...