You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 10:05:39