Linux下删除目录多文件跨行重复行并保留首次出现行的方法
跨CSV文件去重并保留首次出现行的解决方案
你的现有代码只能处理单文件内的重复行,因为每个文件会启动独立的awk进程,seen数组无法在进程间共享。要实现跨文件去重,需要用单个awk进程处理所有文件,维护全局的重复行记录,具体步骤如下:
1. 生成有序的文件列表
先把所有CSV文件按你需要的顺序(比如文件名、创建时间)整理成列表,确保首次出现的行所在文件优先处理:
# 按文件名排序生成文件列表,可根据需求调整排序规则 find . -type f -name "*.csv" | sort > csv_files.txt
2. 全局去重并生成临时文件
用单个awk进程遍历所有文件,全局记录已出现的行,只将首次出现的行写入对应文件的临时副本:
awk ' # 切换到新文件时,关闭上一个临时文件(避免资源泄漏) FNR == 1 { if (prev_file != "") close(prev_file ".tmp") prev_file = FILENAME } # 仅当该行从未出现过时,写入临时文件并标记为已见 !seen[$0]++ { print > FILENAME ".tmp" } # 处理完最后一个文件后关闭临时文件 END { if (prev_file != "") close(prev_file ".tmp") }' $(cat csv_files.txt)
3. 替换原文件
将临时文件覆盖原文件:
while read file; do mv -f "$file.tmp" "$file" done < csv_files.txt
关键说明
- 顺序重要性:
find | sort的排序规则决定了哪份文件的行会被优先保留,如果需要按文件创建时间排序,可改为find . -type f -name "*.csv" -printf "%C@ %p\n" | sort -n | cut -d' ' -f2- > csv_files.txt - 内存占用:
seen数组会存储所有已出现的行内容,如果CSV文件极大,可能需要调整awk的内存限制,不过50个普通CSV文件通常不会有问题 - 安全测试:执行替换前可先检查临时文件的内容是否符合预期,避免误操作
内容的提问来源于stack exchange,提问作者safa
相关产品推荐
相关产品推荐

