You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Linux下如何过滤文本中连续重复的指定字符串(非全局去重)

Linux下如何过滤文本中连续重复的指定字符串(非全局去重)

哥们儿,我懂你现在的困扰了!你要处理b.txt里的内容,核心需求是只删掉连续重复出现的「Sam’s Newsletter:」——也就是连续两行都是这个字符串时,删掉前一行,保留后一行;而不是全局把所有重复的这个字符串只留一个对吧?之前用的awk '!a[$0]++' b.txt > c.txt这个命令太猛了,直接全局去重,把你本来要保留的那两组里的第二个也给干掉了,完全不符合预期。

给你一个精准匹配需求的awk命令,专门处理这种连续重复的指定字符串,不会误删非连续的重复项:

awk '{
    if ($0 == "Sam’s Newsletter:" && prev == $0) {
        # 连续重复的目标字符串,跳过不打印
    } else {
        print $0
    }
    prev = $0  # 记录当前行,供下一行比较用
}' b.txt > c.txt

这个命令的逻辑很直白:

  • 我们用prev变量存上一行的内容,每次处理新行时先做判断
  • 如果当前行是目标字符串Sam’s Newsletter:,而且和上一行内容完全一致,就跳过不输出
  • 其他所有情况(比如不是目标字符串的行,或是目标字符串但和上一行不一样的行)都正常打印
  • 最后不管打不打印,都把prev更新成当前行,方便下一轮对比

用这个命令处理你的示例文本,效果完全符合你的要求:

  • Line4的Sam’s Newsletter:会被跳过,Line5的保留
  • Line11的Sam’s Newsletter:会被跳过,Line12的保留
  • Grace、Ned的内容以及所有details行都原封不动保留
  • 不会像之前的命令那样把全局的Sam’s Newsletter:只留一个,完美解决你的问题

备注:内容来源于stack exchange,提问作者joseph22

火山引擎 最新活动