Linux下基于行重复次数对TXT文件进行排序与拆分
按行重复次数拆分大TXT文件的实现方案
方法一:Python脚本(跨平台,适配大文件)
针对3GB级别的大文件,必须采用逐行处理逻辑避免内存溢出,核心分两步执行:
- 统计每行重复次数:首次遍历文件,用字典记录每行内容的出现频次
- 按频次拆分写入:再次遍历原文件,根据每行对应的频次,将内容追加到对应输出文件
示例代码
import os # 定义输出文件映射关系 output_map = { 1: "1instance.txt", 2: "2instances.txt", 3: "3instances.txt" } # 清空已存在的输出文件,避免旧内容干扰 for file_path in output_map.values(): if os.path.exists(file_path): os.remove(file_path) # 第一步:统计每行出现次数 line_counter = {} with open("large_file.txt", "r", encoding="utf-8") as src_file: for line in src_file: # 若需要忽略首尾空格(如"Mary "和"Mary"视为同一行),替换为 line.strip() line_key = line line_counter[line_key] = line_counter.get(line_key, 0) + 1 # 第二步:按频次拆分写入文件 with open("large_file.txt", "r", encoding="utf-8") as src_file: for line in src_file: line_key = line count = line_counter[line_key] if count in output_map: with open(output_map[count], "a", encoding="utf-8") as out_file: out_file.write(line)
注意事项
- 若需统一行首尾空白的判定规则,修改
line_key的赋值逻辑即可 - 脚本全程逐行读写,内存占用极低,适配大文件场景
方法二:Shell命令(Linux/Unix环境)
利用系统基础命令组合,快速完成统计与拆分:
# 第一步:统计每行重复次数并生成临时统计文件 awk '{print $0}' large_file.txt | sort | uniq -c > temp_counts.txt # 提取重复3次的行并写入目标文件 grep "^ *3 " temp_counts.txt | sed 's/^ *3 //' | while read line; do grep -xF "$line" large_file.txt; done > 3instances.txt # 提取重复2次的行并写入目标文件 grep "^ *2 " temp_counts.txt | sed 's/^ *2 //' | while read line; do grep -xF "$line" large_file.txt; done > 2instances.txt # 提取重复1次的行并写入目标文件 grep "^ *1 " temp_counts.txt | sed 's/^ *1 //' | while read line; do grep -xF "$line" large_file.txt; done > 1instance.txt # 清理临时文件 rm temp_counts.txt
说明
sort | uniq -c完成行内容的频次统计grep -xF确保整行完全匹配,避免部分匹配导致的错误
内容的提问来源于stack exchange,提问作者Ruralguy
相关产品推荐
相关产品推荐

