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
相关产品推荐
相关产品推荐

