批量处理250个大.txt文件的id1&id2列重复行去重(Mac内存友好)
批量处理大型TXT文件并基于id1/id2列去重(适配Mac内存限制)
方案一:R语言批量处理(适配你的现有操作习惯)
延续你熟悉的单文件处理逻辑,同时优化内存占用,避免内存溢出:
步骤1:准备工作
- 先创建新文件夹(比如命名为
processed_files),专门存放去重后的文件,防止覆盖原始数据。 - 设置工作目录到原始文件所在路径:
setwd("/path/to/your/original/files") # 替换成你的实际文件夹路径
步骤2:定义高效处理函数
用data.table包的工具替代基础R函数,大幅降低内存占用、提升处理速度:
library(data.table) process_single_file <- function(file_path) { # 1. 高效读取文件(比read.delim省内存、速度快) dt <- fread(file_path, sep = "\t") # 保持和read.delim默认的制表符分隔一致 # 2. 基于id1和id2去重,保留首次出现的行 dt_unique <- unique(dt, by = c("id1", "id2")) # 3. 生成输出路径,存入新建文件夹 output_file <- file.path("processed_files", basename(file_path)) # 4. 保存去重后的文件 fwrite(dt_unique, output_file, sep = "\t") # 5. 强制释放内存,避免单个文件处理后内存残留 rm(dt, dt_unique) gc() }
步骤3:批量执行处理
获取所有.txt文件路径,循环处理每个文件:
# 获取文件夹下所有txt文件的完整路径 file_list <- list.files(pattern = "\\.txt$", full.names = TRUE) # 逐个处理文件 for (file in file_list) { cat("正在处理:", file, "\n") process_single_file(file) }
核心优化点
data.table的fread/fwrite:比基础R函数快3-10倍,内存占用减少约50%- 处理完单个文件后立即清理内存:避免250个文件的内存累积导致溢出
- 单独存放处理结果:最大程度保护原始数据
方案二:Mac终端awk命令(极致内存友好,逐行处理)
如果R处理时仍出现内存不足,可使用awk命令——它逐行读取处理,几乎不占用额外内存:
单文件处理示例
awk '!seen[$1,$3]++' user_1.txt > processed_files/user_1_unique.txt
- 说明:
$1对应id1列,$3对应id2列(根据你的实际列位置调整,比如id1是第2列就写$2);seen[$1,$3]++记录已出现的id组合,!表示只保留首次出现的行。
批量处理所有文件
打开终端,进入原始文件所在文件夹,执行以下命令:
# 先创建输出文件夹 mkdir -p processed_files # 批量处理所有txt文件 for file in *.txt; do echo "正在处理:$file" awk '!seen[$1,$3]++' "$file" > "processed_files/${file%.txt}_unique.txt" done
内容的提问来源于stack exchange,提问作者bear_525
相关产品推荐
相关产品推荐

