Excluindo linhas e duplicatas específicas de um arquivo de texto de lista de palavras de 11 gb

3

Eu tenho um arquivo de lista de palavras de 11gb que já está classificado, já que cada palavra está em sua própria linha.

Eu preciso remover duplicatas e linhas a partir de 077.

Acho que preciso executar o sed e classificar -u juntos, mas também quero uma saída ao vivo (exiba o que está acontecendo no terminal) e, se possível, exiba o tempo restante. Tudo isso em um comando e deve ser capaz de rodar otimamente com desempenho total no Ubuntu 12.10.

O tempo não é muito importante, mas se houver uma maneira de calcular o ETA, posso pedir emprestada a CPU i7 do meu pai, que deve processá-la mais rápido, caso contrário, terei que usar uma CPU mais antiga de 2 núcleos .

Então, por favor, me dê o comando completo, seja sed / sort / awk para fazer isso (o que for mais adequado).

    
por promicin 27.11.2012 / 08:29

2 respostas

1

Como você já entendeu, você precisa usar sort -u para remover todas as linhas duplicadas. No entanto, sort não suporta a exibição de progresso.

Você pode, no entanto, escrever um pequeno script que leia o conteúdo do arquivo de entrada e envie-o para a saída padrão e, ao mesmo tempo, imprima o progresso. Aqui está um exemplo:

#!/bin/bash

set -e

bytes_read=0
byte_count=$(wc -c "$1" | cut -d" " -f1)
chunk_size=500000

while read -N $chunk_size chunk
do
    echo -ne "\rRead $bytes_read of $byte_count bytes [$[ 100 * bytes_read / byte_count ]%]" >& 2
    echo -n "$chunk"
    bytes_read=$[ bytes_read + chunk_size ]
done < "$1"

echo >& 2

Você pode usar este script da seguinte forma:

./script-name input-file | sort -u > output-file

O progresso não levará em consideração o tempo que sort usará para realmente gravar a saída, no entanto, isso é bem menos do que o tempo necessário para ler o arquivo de entrada. Essa deve ser a solução baseada em shell mais eficiente.

    
por Andrea Corbellini 03.01.2013 / 20:06
0

tee e tail -f são bons comandos para seguir a ação conforme os arquivos são gravados, mas também não o ajudarão com o ETA do seu comando de classificação (nem permitirão que você veja o que está acontecendo sob o capô do tipo -u; apenas a saída final após a maior parte do trabalho ser feito)

Ou canalize sua saída através de tee (que gravará em 'output_file' e stdout):

sort -u input_file | tee output_file

ou use tail -f :

sort -u input_file -o output_file &
tail -f output_file

Além disso: se sua entrada for pré-classificada (como sua pergunta sugere) e tudo que você quer é remover linhas duplicadas adjacentes, então uniq é muito mais rápido do que sort -u (e nossa T / cauda será realmente uma maneira útil para monitorar o progresso)

uniq input_file | tee output_file
    
por Ternary 03.01.2013 / 20:27

Tags