我有一个关于删除多个文件中重复行的问题,并在此处提供了一个有用的脚本:从多个 JSON 文件中删除重复行,同时保留文件结构。
问题是我的文件夹有 10000 个文件,每个文件大小为 1.5 MB。该脚本已经运行了好几天,但还远未完成。我的文件夹如下所示:
file.1424-417982.json
file.1424-417995.json
file.1424-418013.json
file.1424-418015.json
file.1424-418019.json
file.1424-418027.json
(9994 more files)
我已确定重复行仅出现在指定范围内的文件中。上面的前四个文件中可能存在重复行,但这些行不会出现在该文件夹中的任何其他文件中。同样,文件 2-5 中可能存在重复项,但其他文件中不会存在重复项。如何修改 shell/bash 脚本以仅查找 4 个文件范围内的重复项,并按顺序执行此操作近 10000 次,将范围从 1-4、2-5、3-6...9996-10000 转换?
这是为我提供的用于查找重复项的代码。我在只有 6 个文件的测试文件夹上对其进行了测试,速度足够快。
#!/bin/bash
temp=$(mktemp)
for file_to_dedupe in $(echo *.json|sort)
do
for file_to_strip in *.json
do
[ "$file_to_dedupe" == "$file_to_strip" ] && continue
grep -w -Ff ${file_to_dedupe} -v ${file_to_strip} > ${temp}
mv ${temp} ${file_to_strip}
done
done
答案1
我修改了脚本以 4 乘 4 循环文件 - 在大约 20 个文件上进行了测试,看起来它正在工作。该脚本会将文件名存储在一个数组中,然后将它们 4 by 4 循环:
temp=$(mktemp)
declare -a files=($(echo *.json|sort))
length=$(echo ${#files[@]})
for ((i=0;i<length;i++))
do
for ((j=0;j<=3;j++))
do
[ "${files[i]}" == "${files[i+j]}" ] && continue
[ "$((i+j))" -ge "$length" ] && continue
echo ${files[i]} ${files[i+j]}
#grep -w -Ff ${files[i]} -v ${files[i+j]} > ${temp}
#mv ${temp} ${files[i+j]}
done
done
我这里只是echo
输出,如果你认为它工作正常,那么删除注释。