使用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 }
使用方式
- 将脚本保存为
filter.awk文件,执行命令:
awk -f filter.awk 你的输入文件名.txt > 输出文件名.txt
- 或直接在命令行运行单行命令:
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
相关产品推荐
相关产品推荐

