您的位置:首页 > 运维架构 > Linux

用 awk 统计文本文件中的某一列之和 (附 awk 命令简介)

2016-03-15 17:25 399 查看



awk -F'\t' -v sum=0 '{sum += $1} END{print sum}' file_name

统计输出结果的最后一列之和:

result | awk -F'\t' -v sum=0 '{sum += $NF} END{print sum}'

附: awk 命令简介

Unix / Linux 系统中,多用纯文本文件表示一些带格式的内容,比如就像数据库里面的一个 table 那样的格式。这个时候,默认一行(以"\n"结束的一个字符串)为一条记录(一个 record ), 一行中用特定的分隔符(默认是 "\t" )分割的值为一个域( field )。awk 命令就是专门用来处理这样的文件的,它把文件中的每一个 record 作为一个独立的处理单元。也就是说,你写 awk 脚本的时候,直接想象它处理的对象是一个 record 就对了。并且,在 awk 里面,用$n (n=1,2,...,NF)表示该
record 中第 n 个 field 的值,其中NF是 record 中 field 的个数。

awk 命令的基本格式: 

awk '[BEGIN{statements}] {statements} [END{statements}]' file_name

其中 [] 里面的内容是可选项,也就是说没必要的话可以不写。所以简化之后的 awk 命令的基本形式是:

awk '{statements}'

statements 表示处理语句的序列。 

需要记住的是,awk 的那些操作语句,包括 BEGIN{}、 {}、 END{},必须都放在同一对单引号('')之中,就像上面写的那样,单引号是不能省略的。

有了上述知识,读者应该已经明白了该如何写 awk 命令了。下面通过一些例子来进一步介绍这个命令。

假如 t1.log 的内容为(请将空白地方换成制表符 "\t"):

1 2 3 4 5

5 6 7 8 9 10

例1,输出文件 t1.log 的第一列:

awk '{print $1}' t1.log

输出为:

1

5

这里需要说明的是,awk 中的 print 命令会默认地在最后加上一个换行符 "\n"。

例2,输出文件 t1.log 的第3和第5列:

awk '{print $3, $5}' t1.log

输出为:

3 5

7 9

这里需要说明的是,如果你在print里面用逗号(,)分割要输出的内容,那么 awk 把逗号(,)换做默认的分隔符来输出(一般为 “\t" )

例3,输出 t1.log 每一行的最后一列:

awk '{print $NF}' t1.log

输出为:

5

10

到这里,读者应该已经能够用 awk 做一些简单的操作了,比如查看一个格式化文件里面你感兴趣的那些属性。但是,上面的知识还远不够发挥 awk 的功能。我们再看一个复杂一些的例子。

例4,统计文件 t1.log 中最后一列中大于 5 的那些域的和,并将其输出:

awk -v sum=0 '{if($NF>5) sum+=$NF} END{print sum}'

输出为:

10

这里面需要说明的有几条。第一,用 -v 参数来指定 awk 的输入变量。比如上例中的 " -v sum=0 " 的含义是,在 awk 的操作部分里(单引号 '' 之中的部分),sum是作为一个变量可用的,并且它的初始值为0。第二,awk 的BEGIN、主体、END部分里面,statements是可以很复杂的,比如加入一些判断语句。第三,我们一般在 awk 的BEGIN 部分做一些初始化工作,主体部分来操作每一行(也就是每一个 record ),END 部分做后处理并输出结果。

到这里为止,我们掌握的 awk 操作还远未达到它的处理能力。 awk 是可以用来编程的,并且有一些内置的函数可以调用。如果能够结合其他的 shell 命令,那么 awk 可以做很多你想象不到的事情。

    本来来自:http://#.com/zhleilei/blog/item/829212d77d6014d4a144df9c.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux awk