命令head tail uniq tac都是逐行操作的,所以不管是什么是时候,都需要进行逐行的处理,我们可以使用awk来解决
看一看如何使用不同的awk命令来模拟诸如head tail tac命令
比如模拟head命令读取文件前10行并打印出来
awk ‘NR <= 10’ filename
模拟tail 命令打印文件 后10行
awk ‘{buffer[NR %10] = $0;} END {
for(i=1;i<11;i++){print buffer[i%10]}
}’ filename
模拟tac命令逆序打印输入文件的所有行
$awk ‘{buffer[NR] = $0;}’ END {for {i=NR;i>0;i–){
print buffer[i]}
}’ filename
awk中,我们打印输入流中行号小于等于0的行,行号可以通过特殊变量NR获得
在tail命令的实现中,我们使用了散列技术,数组buffer索引由散列函数 NR%10决定的,其中变量NR包含了当前的行号,$0包含了当前的文本行,因此 %将所有余数相同的行都映射到一个数组索引,在END{ } 语句块中,对数组10个索引进行迭代,并打印对应的行
tac命令的实现中,将所有的行存入一个数组中,将程序流程进入END, NR存储着最后一行的行号
然后for循环对NR递减到1