Classificar milhões de arquivos de texto em uma pasta usando ordenação unix

4

Eu estou tentando classificar muitos arquivos (milhões, ou seja, aproximadamente 2,5 m) de arquivos .txt em uma pasta chamada NZParsed.

Todos os arquivos na pasta são nomeados como 1.txt 2.txt e assim por diante até 25xxxxx.txt

Depois de executar o seguinte comando no eclipse:

os.system("sort -k1,1 -k3,3n -k4,4n -y 1048576 /home/viraj/NZ/NZParsed/* -o /home/viraj/NZ/SplitIndex/abcd.txt")

Eu recebo um erro:

sh: 1: sort: Argument list too long

Alguém pode me dizer qualquer outra maneira que eu poderia classificar todos esses arquivos em um arquivo e dividi-los usando o seguinte comando no eclipse:

os.system("split -C 200m /home/viraj/NZ/SplitIndex/abcd.txt /home/viraj/NZ/SplitIndex/")
    
por Viraj 19.03.2014 / 02:01

1 resposta

3

O problema não tem nada a ver com o eclipse ou o python. Você está atingindo o limite de ARG_MAX, para obter mais detalhes, consulte aqui mas, resumidamente, esse é o limite de quantos bytes lista de argumentos para um comando pode ser.

Portanto, para evitar isso, você precisa sort de uma maneira que não liste os arquivos. Por exemplo:

for i in /home/viraj/NZ/NZParsed/*; do cat "$i" ; done |
    sort -k1,1 -k3,3n -k4,4n -y 1048576 > /home/viraj/NZ/SplitIndex/abcd.txt

O comando acima irá cat de cada arquivo e depois passará o conteúdo de todos os arquivos através do comando sort . Dessa forma, os arquivos nunca são listados e você não terá o problema ARG_MAX .

Outra abordagem seria usar a opção -exec do find:

find /home/viraj/NZ/NZParsed/ -type f -name '[0-9]*.txt' -exec cat {} + | 
    sort -k1,1 -k3,3n -k4,4n -y 1048576 > /home/viraj/NZ/SplitIndex/abcd.txt
    
por terdon 19.03.2014 / 02:14

Tags