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

来源:互联网 发布:淘宝天天特价明天预告 编辑:程序博客网 时间:2024/05/22 05:30


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

0 0