您的位置:首页 > 其它

awk 简介

2015-10-26 17:51 369 查看
– Start

很多人以为 awk 是一个 Linux 命令,其实 awk 是一种编成语言。下面是一个使用 awk 的典型例子。

# 统计空行数
awk 'BEGIN {empty_row_count=0} /^$/{empty_row_count++} END {print empty_row_count}' test.txt


典型的 awk 分为三部分。

BEGIN 部分只执行一次,用来初始化一些变量,打印表头等。

END 部分也只执行一次,用来在处理完文件后执行一些扫尾工作。

中间是处理文件部分,awk 逐行处理文件,对于每一行,它都会执行一次中间的语句。

中间的语句又分为两部分。

模式(Pattern)部分,它其实就是判断语句,判断是否执行它后面的语句。awk 支持如下形式的模式。

/regular expression/
relational expression
pattern && pattern
pattern || pattern
pattern ? pattern : pattern
(pattern)
! pattern
pattern1, pattern2


动作(Action)部分,真正的处理文件部分,如:{empty_row_count++}

awk 被设计用来处理结构化文件。下面的文件保存了一些交易记录。如果你要分析汇总这些交易记录,你不需要创建一个表,使用 SQL 语句分析,你也无需使用 perl 等功能更强大的语言。

trade_id,trade_date,client,amount
1,2015-10-26,ZhangSan,100
2,2015-09-15,ZhangSan,50
3,2015-10-26,Lisi,200


假设让你汇总一下 ZhangSan 所有的 amount 该怎么办呢?试一试下面的命令吧。

awk -F, '$3=="ZhangSan"{amount+=$4} END {print amount}' test.txt


-F 指定列分隔符,默认列分隔符是空格和制表符。

$0 引用整行, $1 引用第一列, $2 引用第二列 …

如果让你汇总一下所有人的amount 该怎么办呢?

awk -F, 'NR > 1{map[$3]+=map[$3] + $4;} END {for (key in map) {printf("%s=%s\n", key, map[key]);}}' test.txt


怎么样?看不懂?等你学了数组就能看懂了。

– 更多参见:awk 精萃

– 声 明:转载请注明出处

– Last Updated on 2015-10-28

– Written by ShangBo on 2015-10-26

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