Classifique todos os arquivos em uma pasta independentemente, com um arquivo de saída para cada

0

Eu tenho várias pastas que contêm vários arquivos de texto, variando de dezenas a 100 s. Esses arquivos de texto são bancos de dados simples contendo milhões de linhas, com cada linha contendo um único registro. No entanto, os registros neles não são classificados e contêm várias duplicatas. Gostaria de classificar e desduplicar todos eles individualmente (ou seja, independentemente uns dos outros), mas, no meu entender, sort só pode produzir uma saída concatenada de todos os arquivos de entrada - ou seja, mesmo se receber vários arquivos, ele produzirá apenas um arquivo de saída contendo os resultados combinados de todos esses arquivos.

Como posso classificar todos os arquivos na pasta atual para produzir um arquivo de saída classificado individualmente para cada um ? Eu também gostaria que os arquivos de saída fossem enviados para uma subpasta dentro do diretório atual. Um for loop é a solução óbvia para mim, mas estou perguntando aqui se existe uma maneira mais simples de fazer isso com sort que eu não encontrei ou perdi. Meu bash conhecimento também é muito carente, portanto, se um for loop for a solução mais simples, eu apreciaria alguém fornecendo a melhor maneira de fazer isso em vez de gastar muitos dias hackeando algo juntos que ainda ficaria aquém do que eu quero fazer.

    
por Hashim 13.09.2018 / 01:17

1 resposta

1

Sim, você pode fazer isso com for . Mesmo se houver "alguma maneira mais simples de fazer isso com sort " (mas eu não penso assim), isso também é bem simples:

# cd to the directory you want to process

mkdir sorted    
for file in *; 
do
   printf 'Processing %s\n' "$file"
   [ -f "$file" ] && sort -u "$file" > "./sorted/$file"
done

Notas:

  • for file in * não processa arquivos em subdiretórios.
  • printf é apenas para relatar o progresso. Na verdade, ele deve ser colocado após [ ... ] (veja abaixo), mas não quero complicar demais o código. Você pode simplesmente remover a linha printf , se quiser que a coisa toda fique em silêncio.
  • [ -f "$file" ] verifica se $file é um arquivo regular. Com o padrão mais geral (por exemplo, * ), precisamos dessa condição pelo menos para evitar executar sort com o diretório sorted como um argumento (isso causaria um erro, inofensivo, mas não elegante). Provavelmente, esse teste não será necessário se você usar um glob mais específico como *.txt ou *.db em vez de * (por exemplo, para ignorar um arquivo desktop.ini perdido que não deve ser processado). Nesse caso, você pode omitir [ ... ] && e iniciar a linha com sort (deixar a linha intacta não deve atrapalhar).
  • sort suporta várias opções e você pode querer usar algumas delas, dependendo de como você precisa classificar.

  • sort -u de-duplica entradas logo após classificá-las, e quando já estiver usando sort é uma alternativa menos redundante ao uso do comando uniq .

Se você precisasse escolher arquivos de acordo com condições mais complexas do que um simples glob, find poderia ser melhor para começar. Para sua tarefa atual for deve estar bem.

    
por 13.09.2018 / 08:25