曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3294|回复: 0
打印 上一主题 下一主题

使用 awk 模拟 head, tail, tac

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2012-4-8 21:24:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面使用 awk 简单模拟 head ,tail ,tac  这几个命令的基本功能。

测试文本:
# cat record.txt
1    6    11    16    21
2    7    12    17    22
3    8    13    18    23
4    9    14    19    24
5    10    15    20    25


1. 模拟 head 打印头 3 行内容
# awk 'NR <= 3' record.txt
1    6    11    16    21
2    7    12    17    22
3    8    13    18    23

2. 模拟 tail 命令打印末尾 3 行内容
# awk '{ buffer[NR % 3] = $0; } END { for (i = NR - 2; i < NR + 1; i++){ print buffer[i % 3] } }'  record.txt
3    8    13    18    23
4    9    14    19    24
5    10    15    20    25
上面, buffer[NR % 3] = $0; 这条语句实际是从第 1 条记录开始不断的往 buffer[] 数组里填充每行数据,但最终该数组也只有 3 条记录,这是个不断冲刷覆盖的过程,其中 $0 表示正在处理的当条记录的内容。最后,我们用一个 for 循环将最后的 3 条记录打印出来。

3. 模拟 tac 指令以倒序打印
# awk '{buffer[NR] = $0; } END { for (i = NR; i > 0; i--) {print buffer} }' record.txt
5    10    15    20    25
4    9    14    19    24
3    8    13    18    23
2    7    12    17    22
1    6    11    16    21
该模拟过程比模拟 tail 更简单一些。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-15 10:19 , Processed in 0.075947 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表