从文件夹中的多个文件中删除重复行:仅检查某个范围内的文件

从文件夹中的多个文件中删除重复行:仅检查某个范围内的文件

我有一个关于删除多个文件中重复行的问题,并在此处提供了一个有用的脚本:从多个 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输出,如果你认为它工作正常,那么删除注释。

相关内容