如何用awk提取第三列值为0的连续行块首尾行?
提取第三列为0的连续行块的首尾行
需求说明
输入文本(test.txt):
chr1 1 1 chr1 2 5 chr1 3 0 chr1 4 0 chr1 5 0 chr1 6 3 chr1 7 4 chr1 8 0 chr1 9 0 chr1 10 6
期望输出:提取第三列值为0的连续行块的首行和末行,单个0值行也需输出:
chr1 3 0 chr1 5 0 chr1 8 0 chr1 9 0
问题重现
尝试的awk脚本(test.awk):
$3 != p1 { print p0 $0 } { p1 = $3; p0 = $0 ORS } END { printf "%s", p0 }
执行命令:awk -f test.awk test.txt,得到不符合预期的结果:
chr1 1 1 chr1 1 1 chr1 2 5 chr1 2 5 chr1 3 0 chr1 5 0 chr1 6 3 chr1 6 3 chr1 7 4 chr1 7 4 chr1 8 0 chr1 9 0 chr1 10 6 chr1 10 6
正确解决方案
使用以下awk脚本可以实现需求:
$3 == 0 { if (!in_zero_block) { print $0 in_zero_block = 1 } last_line = $0 next } in_zero_block { print last_line in_zero_block = 0 } END { if (in_zero_block) { print last_line } }
执行命令:awk -f correct.awk test.txt,即可得到期望输出。
逻辑解释
- 当第三列为0时:
- 若未进入0值块,打印当前行(块首行)并标记进入块
- 持续更新当前块的末行
- 当第三列不为0且处于0值块时:
- 打印记录的末行,标记退出块
- 文件结尾处理:若结束时仍处于0值块,打印末行(适配单个0值行或末尾连续0的场景)
内容的提问来源于stack exchange,提问作者Paillou
相关产品推荐
相关产品推荐

