命令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

发表评论

邮箱地址不会被公开。 必填项已用*标注