Remover linhas duplicadas de vários arquivos em uma pasta: Verificar somente arquivos dentro de um intervalo

4

Eu tinha uma pergunta sobre como remover linhas duplicadas em vários arquivos e recebi um script útil aqui: Remover linhas duplicadas de vários arquivos JSON, preservando a estrutura do arquivo .

O problema é que minha pasta tem 10000 arquivos e cada um tem 1,5 MB de tamanho. O script está sendo executado há dias e está longe de ser concluído. Minha pasta é assim:

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)

Eu determinei que as linhas duplicadas são apenas em arquivos dentro de um intervalo especificado. Pode haver linhas duplicadas nos primeiros quatro arquivos acima, mas essas linhas não estarão em nenhum outro arquivo na pasta. Da mesma forma, pode haver duplicatas nos arquivos 2-5, mas não nos outros arquivos. Como eu modifico o script shell / bash para procurar apenas por duplicatas dentro de um intervalo de 4 arquivos e fazer isso sequencialmente quase 10000 vezes mudando o intervalo de 1-4, 2-5, 3-6 ... 9996-10000? / p>

Aqui está o código fornecido para procurar por duplicatas. Eu testei em uma pasta de teste com apenas 6 arquivos e foi rápido o suficiente.

#!/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
    
por Zwentibold 27.11.2016 / 10:35

1 resposta

3

Eu modifiquei o script para fazer o loop dos arquivos 4 por 4 - testado em 20 arquivos, parece que está funcionando. O script armazenará os nomes dos arquivos em uma matriz e, em seguida, os conectará 4 por 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

Eu só echo da saída aqui, se você acha que está funcionando bem, remova os comentários.

    
por 27.11.2016 / 13:43