No passado, eu tive que classificar arquivos grandes demais para sort
. Presumo que este seja também o seu problema, embora, se fornecer mais informações, talvez possamos diagnosticar melhor o seu problema.
A solução para meu problema foi dividir o arquivo com grep
como pré-processador. Dê uma olhada nos seus dados para ver onde os aglomerados estarão. Eu estou supondo que é decentemente espalhado sobre o espaço alfanumérico, mas vou discutir como lidar com grumos mais tarde.
for char1 in other {0..9} {a..z}; do
out="/tmp/sort.$char1"
echo "Extracting lines starting with '$char1'"
if [ "$char1" = "other" ]; then char1='[^a-z0-9]'; fi
grep -i "^$char1" *.txt > "$out"
sort -u "$out" >> output.txt || break
done
(Isso usa um bashumano. Para evitá-lo, nomeie explicitamente cada um dos 37 caracteres, como for char1 in other 0 1 2 3 4 5 6 7 8 9 0 a b c d e f ...
)
Clumps: É completamente possível que algumas dessas chamadas em sort
em loop sejam segmentadas devido a ter muitos dados. Apenas revise essa iteração para ficar mais dividida em partes. Isso pode ser tão simples quanto remover o sinalizador -i
do grep e chamar cada letra maiúscula (não se esqueça de alterar o other
para [^a-zA-Z0-9]
), ou pode ser necessário escavar os dados. Se esta for uma lista de pacotes de software, você pode ter muitas linhas que começam com "lib" e, portanto, a iteração /tmp/sort.l
falhará. A parte || break
desse loop interromperá o processamento neste ponto para que você possa corrigi-lo e continuar de onde parou. Seguindo o exemplo "lib", você pode querer continuar com algo assim:
for char1 in 'l[a-h]' 'lia' lib{a..z} lib{0..9} 'li[c-z]' 'l[j-z]' {m..z}; do
...
Isso divide a lista l
em partes antes e depois da porção lib *. É um pouco feio, mas deve funcionar. Basta prestar atenção à ordem desejada para que você possa preservá-la.