【发布时间】:2022-01-22 13:32:31
【问题描述】:
我每天需要扫描数十万个文件以从中删除重复条目。这些文件中的每一个都有数千条记录
示例输入文件
2019-10-04,3.9,3.29,5.85,6.15
2019-10-05,3.8,7.02,5.69,6.83
2019-10-05,3.8,8.02,8.69,1.83
2019-10-07,1.8,1.02,4.69,7.83
这是我为它编写的脚本,大约需要一个小时或更长时间才能完成。
脚本
#!/bin/bash
LOOKUP_DIR="/path/to/source_files"
CLEANEDUP_DIR="/path/to/cleaned_content"
remove_dup(){
fname=${1}
awk -F"," 'prev && ($1 != prev) {print seen[prev]} {seen[$1] = $0; prev = $1} END {print seen[$1]}' "${fname}" > "${CLEANEDUP_DIR}/${fname}"
}
cd ${LOOKUP_DIR}
for k in *.csv
do
remove_dup "${k}" &
done
wait
检查重复项的方法是查看第一个字段,如果该字段(在本例中为日期)有多个条目,则只需要保留包含此日期的最后一行,其余的则删除。
请问有没有办法优化我写的逻辑?
【问题讨论】:
-
行是按第一个字段排序的吗?
-
文件是否有可能按照
2019-10-05,...、2019-10-07,...、2019-10-05,...的顺序记录? -
当您决定是否重复时,是否应该只包含第 1 列?如果是,它选择带有
2019-10-05的两行中的哪一行有关系吗? -
@M.NejatAydin - 是的,您提到的订单可以包含在 2019-10-05、...、2019-10-07、...、 2019-10-05,...
-
如果您有数十万个文件,那么您几乎无法同时处理它们,除非您有足够的 CPU 和 IO 来备份它。根据您的硬件配置,您可能希望使用 GNU 并行来确定要生成的正确进程数。