Combinação, classificação e exclusão de duplicatas em vários arquivos gzip

2

Vou combinar 15 arquivos gzip diferentes. Variando em tamanho de 2 shows para 15 shows cada, então os arquivos são relativamente grandes. Eu fiz pesquisas sobre a melhor maneira de fazer isso, mas ainda tenho algumas perguntas.

Resumo:

Começando com 15 arquivos gzip diferentes, eu quero terminar com um arquivo livre ordenado e duplicado no formato gzip.

Para fins de conversa, classificarei os arquivos da seguinte forma: file1 , file2 ... file15

Estou planejando usar o comando sort com a opção -u . De acordo com a página man para ordenar isto significa:

-u, --unique with -c, check for strict ordering; without -c, output only the first of an equal run

Então, o que estou pensando em fazer é isto:

sort -u file* > sortedFile

Do meu entendimento eu teria um arquivo que é classificado e não tem duplicatas. De meus arquivos de teste eu criei este parece ser o caso, mas só quero verificar isso está correto?

Agora, outra ruga para o meu dilema:

Como todos os arquivos estão no formato gzip, existe uma maneira de usar zcat ou outro método para canalizar a saída para classificar, sem antes precisar converter de gzip para um arquivo de texto, combiná-los e compactá-los novamente no gzip ? Isso economizaria uma quantidade enorme de tempo. Qualquer entrada é apreciada. Estou procurando conselhos sobre isso; Eu não sou contra a pesquisa nem sou casado com o meu método, eu gostaria de algumas dicas antes de começar a executar esses comandos contra 120 GB de dados.

Obrigado aos povos!

    
por Dylan 11.03.2015 / 07:18

1 resposta

2

O problema é que os arquivos individuais não são classificados, ou seja, se você usou algo como sort -u file* > sortedFile , o sort teria que carregar o conteúdo de todos os arquivos e depois classificá-los. Eu suponho que isso é ineficiente, já que você provavelmente não tem mais de 120 GB de RAM.

Eu sugeriria que você primeiro classificasse todos os arquivos individualmente e mesclasse-os usando sort -m , algo ao longo destas linhas (este código não foi testado!):

for f in file*; do
  gzip -dc "$f" | sort > sorted.$f.bak
done
sort -m -u sorted.file*.bak > sortedFile
rm -f sorted.file*.bak

Parte relevante da página do manual de classificação (por exemplo, link ):

-m, --merge merge already sorted files; do not sort

Atualizar : depois de ler link , eu acho que seu comando original pode ser tão rápido, já que o tipo divide sua entrada em partes gerenciáveis de qualquer maneira. Sua linha de comando ficaria assim:

 sort <(zcat file1) <(zcat file2) ... <(zcat file15) > sortedFile

Isso também permitiria o uso de mais de um núcleo de sua máquina.

    
por 11.03.2015 / 07:43

Tags