Awk 把文件中的每行看作一条记录,每条记录又可以看作空格分割开来的字段。这很像是面向记录的数据库的格式。
一个简单的awk程序看起来如下:
awk '/abc/ {print $2}' file.txt
它表示遇到包含字符串"abc"的行时,输出第二个字段($2
)。
通常一条记录就是一行,字段是行中的一部分。利用RS
变量,可以实现跨行的记录的操作。
比如对于文件
#Name #Age Zhang San 18 Li Si 19
可以处理如下:
BEGIN { RS="\n\n"; FS="\n"; } # 第一条记录表头,略过不处理 ! /#/ { print $1,$2; }
固然可以通过管道(Pipe)在awk程序的输出在外部进行排序,在awk内部对数组进行排序后再输出会更自然,尤其是需要对几组不同的数据分别排序的时候。
asort
和asorti
是awk内置的排序函数。前者按值排序,后者按键值排序。
asorti(data, dest); for(i in dest) { k = dest[i]; print k, data[k]; } asort(data); for(k in data) print k, data[k];
asort
有个“缺点”是会破坏原数组的索引。
在利用for(k in array)
语句输出之前,可以通过设置PROCINFO["sorted_in"]
来影响排序顺序。
这种方法似乎需要高一点版本的awk程序。
for(k in data) print k, data[k] | "sort -n"; close("sort -n"); # 一个好的实践 pipe = "sort -n"; for(k in data) print k, data[k] | pipe; close(pipe);
常用的比如说对某列进行相加汇总:
awk '{sum+=$3;} END {print sum;}' file.txt
如果要去除文件中的重复行,有下面三种情况:
uniq file.txt
sort -u file.txt
awk '!($0 in array) { array[$0]; print }' file.txt
awka可以把你的awk程序转换为C程序代码,然后编译成可执行程序。这可以:
Awka-ELM提供了一个框架,以允许对awk进行扩展。