双列文件行去重:如何删除含已出现数值的行?
嘿,这个需求很明确——要从双列文件里筛选出完全「新鲜」的行,也就是当前行的两个数值都没在之前保留的行里出现过对吧?我给你准备了两种实用的解决方案,不管是用脚本还是命令行都能轻松搞定。
先明确需求与示例
现有双列文件内容:
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
相关产品推荐
相关产品推荐

