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

使用Bash/Awk删除非连续重复行,保留指定连续重复行

保留连续{开头重复行、删除其他重复行的Awk解决方案

核心规则

我们需要实现的过滤逻辑:

  • 仅保留连续重复且以{开头的所有行(包括成对或多行连续重复)
  • 所有其他行(非连续重复行、连续重复但不以{开头的行)仅保留首次出现的实例
  • 严格维持原文件的行顺序

基础Awk脚本实现

BEGIN { prev = "" }
{
    # 连续重复的{开头行:直接保留
    if ($0 == prev && substr($0, 1, 1) == "{") {
        print $0
        prev = $0
        next
    }
    # 非连续重复/非{开头的连续重复:仅保留首次出现
    if (!($0 in seen)) {
        print $0
        seen[$0] = 1
    }
    prev = $0
}

使用方式

  1. 将脚本保存为filter.awk文件,执行命令:
awk -f filter.awk 你的输入文件名.txt > 输出文件名.txt
  1. 或直接在命令行运行单行命令:
awk 'BEGIN { prev = "" } { if ($0 == prev && substr($0,1,1) == "{") { print $0; prev=$0; next } if (!($0 in seen)) { print $0; seen[$0]=1 } prev=$0 }' 你的输入文件名.txt > 输出文件名.txt

示例验证

针对你提供的示例输入,运行脚本后会完全匹配预期输出:

  • 非连续重复行(如persistent homology intervals in dim 1:)仅保留首次出现
  • 连续重复但非{开头的行(如persistent homology intervals in dim 0:)仅保留首次出现
  • 连续重复且{开头的行全部保留(如最后两行{[489,713]...})

特殊场景适配

如果某行既单独出现过,又在后续出现连续重复的{开头实例,且你需要优先保留连续重复行、删除之前的单独实例,可以使用两次遍历的进阶脚本:

# 第一次遍历:标记所有属于连续{重复的行内容
NR == FNR {
    if ($0 == prev && substr($0,1,1) == "{") {
        keep[$0] = 1
        keep[prev] = 1
    }
    prev = $0
    next
}
# 第二次遍历:按规则输出
{
    if ($0 in keep) {
        print $0
    } else if (!($0 in seen)) {
        print $0
        seen[$0] = 1
    }
}

使用命令:

awk -f filter_advanced.awk 你的输入文件名.txt 你的输入文件名.txt > 输出文件名.txt

内容的提问来源于stack exchange,提问作者tyo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 20:04:51