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

双列文件行去重:如何删除含已出现数值的行?

嘿,这个需求很明确——要从双列文件里筛选出完全「新鲜」的行,也就是当前行的两个数值都没在之前保留的行里出现过对吧?我给你准备了两种实用的解决方案,不管是用脚本还是命令行都能轻松搞定。

先明确需求与示例

现有双列文件内容:
1 4
1 11
4 5
5 11

规则:遍历每行,若当前行任意一列数值已在之前保留的行的任意一列出现过,则删除该行。
预期结果:
1 4
5 11


方法1:Python脚本实现(直观易扩展)

这个方法逻辑清晰,适合需要后续自定义调整的场景:

# 用集合存储已出现过的数值,查询效率极高
seen_numbers = set()

# 打开输入文件和输出文件
with open("input.txt", "r") as in_file, open("output.txt", "w") as out_file:
    for line in in_file:
        # 去除首尾空白并跳过空行
        cleaned_line = line.strip()
        if not cleaned_line:
            continue
        
        # 拆分出两个数值并转为整数
        num1, num2 = map(int, cleaned_line.split())
        
        # 检查两个数值是否都未出现过
        if num1 not in seen_numbers and num2 not in seen_numbers:
            out_file.write(f"{cleaned_line}\n")
            # 将这两个数值加入已出现集合
            seen_numbers.add(num1)
            seen_numbers.add(num2)

逻辑拆解

  • 用set()存储已出现的数值,保证O(1)的查询速度
  • 逐行处理文件,跳过空行避免异常
  • 只有当两个数值都未在历史记录中出现时,才保留该行并更新历史集合

方法2:Awk命令行实现(终端快速处理)

如果习惯用终端工具,一行命令就能完成,无需编写脚本:

awk '{
    # 检查两个字段是否都未在已出现数组中
    if (!($1 in seen) && !($2 in seen)) {
        print $0;
        # 标记这两个数值为已出现
        seen[$1] = 1;
        seen[$2] = 1;
    }
}' input.txt > output.txt

逻辑拆解

  • Awk的关联数组seen用来追踪已出现的数值
  • 对每行进行判断,符合条件则打印该行并更新数组
  • 结果直接重定向到输出文件output.txt

运行任意一种方法后,输出文件的内容都会和预期一致:

1 4
5 11

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:46:18