You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 10:12:45