目前虽然有很多工具可以代替awk,但是呢我还是认为awk还是非常重要,比如有时候load数据到hive,mysql发现数据有点问题,这样可以先对比文件和库中数据是否一致,这样awk就发挥用处了,还有从文本中统计一些简单的数据,awk可是信手拈来。在这也简单的介绍下awk的用法。

awk命令格式与选项

awk [options] 'script' var=value file(s)
awk [options] -f scriptfile var=value file(s)

常用命令选项:

-F fs 指定分隔符,可以是字符串和正则表达式

-v var=value   赋值一个用户定义变量,将外部变量传递给

awk -f scripfile  从脚本文件中读取awk命令

-m[fr] val   对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

awk基本结构

awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file

这块主要是要理解执行原理,这块理解透彻了,对一个编程的人来说,就变得简单多了。

第一步:执行BEGIN{ commands }语句块中的语句;

第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。

第三步:当读至输入流末尾时,执行END{ commands }语句块。

BEGIN语句是在awk在读取文本之前被执行,是可选模块,一般是用来写变量初始化,打印表头等语句

END语句是在awk读取文本之后被执行,也是可选模块,一般用来做所有行的汇总,如sum之类的。

pattern 读取的文本的每一行,如果没有此模块,会默认打印读取的每一行。

如下:

echo "hello word"|awk 'BEGIN{print"beging--"}{print}END{print "end--"}'
beging--
hello word
end--

当不带参数的print,它会打印当前行,和print $0一样,print 打印后面用逗号,打印出结果已空格分离,awk中双引号是当做连接使用。

echo|awk '{var="a";var1="b";print var,var1;}'
a b

awk 内置变量

说明:[A][N][P][G]表示第一个支持变量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk
区分可以看这篇
http://www.cnblogs.com/wujin/p/6073100.html

$n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。 
$0 这个变量包含执行过程中当前行的文本内容。
[N] ARGC 命令行参数的数目。
[G] ARGIND 命令行中当前文件的位置(从0开始算)。
[N] ARGV 包含命令行参数的数组。
[G] CONVFMT 数字转换格式(默认值为%.6g)。
[P] ENVIRON 环境变量关联数组。
[N] ERRNO 最后一个系统错误的描述。
[G] FIELDWIDTHS 字段宽度列表(用空格键分隔)。
[A] FILENAME 当前输入文件的名。
[P] FNR 同NR,但相对于当前文件。
[A] FS 字段分隔符(默认是任何空格)。
[G] IGNORECASE 如果为真,则进行忽略大小写的匹配。
[A] NF 表示字段数,在执行过程中对应于当前的字段数。
[A] NR 表示记录数,在执行过程中对应于当前的行号。
[A] OFMT 数字的输出格式(默认值是%.6g)。
[A] OFS 输出字段分隔符(默认值是一个空格)。
[A] ORS 输出记录分隔符(默认值是一个换行符)。
[A] RS 记录分隔符(默认是一个换行符)。
[N] RSTART 由match函数所匹配的字符串的第一个位置。
[N] RLENGTH 由match函数所匹配的字符串的长度。
[N] SUBSEP 数组下标分隔符(默认值是34)。

举例说明几种常用的

echo -e "test 1 2 \ntest1 2 3 4"|awk '{print "记录数:"NR,"字段数:"NF,"$0="$0}'
记录数:1 字段数:3 $0=test 1 2
记录数:2 字段数:4 $0=test1 2 3 4

统计文中的行数:

cho -e "test 1 2 \ntest1 2 3 4"|awk 'END{print NR}'
2

使用NF可以打印出一行的最后一个

echo -e "test 1 2 \ntest1 2 3 4"|awk '{print $NF}'
2
4
echo -e "test 1 2 \ntest1 2 3 4"|awk '{print $NF-1}'
1
3

有时候经常会被问到求和的算法

原始数据

a 10
a 12
b 13
b 12
a 14
a 15
a 13
b 11
a 16
b 17
a 14

单独列求和和分组求和

awk '{sum+=$2}END{print sum}' aa.txt
147
awk '{s[$1]+=$2} END {for(i in s){print i,s[i]}}' aa.txt
a 94
b 53

awk接收外部变量

echo|awk -v v1="a" '{print v1}'
a

awk用法的更多相关文章

  1. awk 用法(使用入门)

    转自:http://www.cnblogs.com/emanlee/p/3327576.html awk 用法:awk ' pattern {action} '  变量名    含义 ARGC   命 ...

  2. awk用法小结(作者总结)

    http://www.chinaunix.net/old_jh/24/691456.html http://wenku.baidu.com/view/ebac4fc658f5f61fb736664d. ...

  3. sed和awk用法

    sed和awk用法 Sed sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为 ...

  4. linux awk用法

    awk是一个强大的文本分析工具,在对数据进行分析并生成报告时显得尤为强大. 使用方法:awk [options]  'BEGIN{ commands } pattern{ commands } END ...

  5. 转shell中的awk用法详解

        awk语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作,完整的awk脚本通常用来格式化文本文件中的信息 调用awk:   第一种,命令行方式 ...

  6. 收集整理的awk用法小结

    awk 用法:awk ‘ pattern {action} ‘ 变量名 含义 ARGC 命令行变元个数 ARGV 命令行变元数组 FILENAME 当前输入文件名 FNR 当前文件中的记录号 FS 输 ...

  7. AWK 用法

     awk 用法:awk ' pattern {action} ' 变量名 含义 ARGC 命令行变元个数 ARGV 命令行变元数组 FILENAME 当前输入文件名 FNR 当前文件中的记录号 FS ...

  8. 精通awk系列(4):awk用法入门

    回到: Linux系列文章 Shell系列文章 Awk系列文章 awk用法入门 awk 'awk_program' a.txt awk示例: # 输出a.txt中的每一行 awk '{print $0 ...

  9. AWK用法入门详解

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...

随机推荐

  1. 【转】LokiJS:纯JavaScript实现的轻量级数据库

    原文转自:http://www.html5cn.org/article-7091-1.html LokiJS一个轻量级的面向文档的数据库,由JavaScript实现,性能高于一切.目的是把JavaSc ...

  2. ubuntu14.04LTS编译MUDOS v22.2b14

    附:MudOS v22.2b14下载连接 简单的编译步骤: (1)运行./build.MudOS (2)vim socket_efuns.c       o 修改Ln:1198的代码为         ...

  3. js DIV延时几秒后消失或显示代码

    1.最常用的方法:  代码如下 复制代码 <script language='javascript' type='text/javascript'> $(function () {     ...

  4. bll编译错误

    如果在项目中 ,bll有函数,却引用报错 原因很可能是因为bll在生成程序集的时候,没有生成好.其中有错误 解决办法. 1.将bll,web,dal重新生成 2.注意bll的生成,该添加的添加,该排除 ...

  5. JS识记

    1.重新按照URL地址加载本页? window.location.reload(); 2.JS中实现命名空间一例? <script type="text/javascript" ...

  6. MVC缓存OutputCacheAttribute 类提高网站效率(转)

    原文转自:http://www.cnblogs.com/iamlilinfeng/p/4419362.html 命名空间:  System.Web.Mvc 程序集:  System.Web.Mvc(在 ...

  7. byte与char的区别

     byte 是字节数据类型 ,是有符号型的,占1 个字节:大小范围为-128—127 .char 是字符数据类型 ,是无符号型的,占2字节(Unicode码 ):大小范围 是0—65535 :char ...

  8. checkbox 选中、取值处理

    [1].[代码] checkbox 选中.取值处理 跳至 [1] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ...

  9. 在Linux下安装PHP过程中,编译时出现错误的解决办法

    在Linux下安装PHP过程中,编译时出现configure: error: libjpeg.(a|so) not found 错误的解决办法 configure: error: libjpeg.(a ...

  10. 07 Linux su和sudo命令的区别

    一. 使用 su 命令临时切换用户身份 1.su 的适用条件和威力 su命令就是切换用户的工具,怎么理解呢?比如我们以普通用户beinan登录的,但要添加用户任务,执行useradd ,beinan用 ...