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

Linux下如何移除文本文件中每条重复行的一个实例?

解决方案

方法1:使用awk命令

通过两次扫描文本文件实现需求,严格保留原行顺序:

NR==FNR {count[$0]++; last=$0; next}
{
    # 计算当前名字需保留的行数:非最后一个名字保留「原次数-1」,最后一个名字保留0
    keep = ($0 != last) ? (count[$0] - 1) : 0
    if (output[$0] < keep) {
        print $0
        output[$0]++
    }
}

将上述代码保存为filter.awk,在终端执行:

awk -f filter.awk input.txt input.txt

逻辑说明

  • 第一次扫描(NR==FNR):统计每个名字的出现次数,同时记录最后出现的名字
  • 第二次扫描:仅当当前行的已输出次数小于「应保留次数」时才打印,自动完成:
    • Mary从4次减为3次、John从3次减为2次、Lucy从2次减为1次
    • 仅出现1次的Mark直接被过滤

方法2:使用Python脚本

如果更熟悉Python,可通过以下脚本处理,同样保留原行顺序:

from collections import defaultdict

# 读取所有行并统计每个名字的出现次数
with open("input.txt", "r", encoding="utf-8") as f:
    lines = [line.strip() for line in f]
name_counts = defaultdict(int)
for name in lines:
    name_counts[name] += 1

# 遍历原行,输出符合要求的内容
output_counts = defaultdict(int)
last_name = lines[-1] if lines else ""
with open("output.txt", "w", encoding="utf-8") as f:
    for name in lines:
        # 确定当前名字的保留数量
        keep_count = 0 if name == last_name else name_counts[name] - 1
        # 未达到保留数量则输出
        if output_counts[name] < keep_count:
            f.write(f"{name}\n")
            output_counts[name] += 1

执行脚本后,output.txt即为处理后的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:05:58