Excluindo linhas e duplicatas específicas de um arquivo de texto de 11 GB

1

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

Eu preciso remover duplicatas e linhas a partir de 077 .

Acho que preciso executar sed e sort -u juntos, mas também quero uma saída ao vivo display what's happening in terminal e, se possível, exibir o time left .

Tudo isso em um comando e deve ser executado de maneira ideal com desempenho total em Live CD ou possivelmente% Backtrack 5 rc3 instalado.

O tempo não é muito importante, mas se houver uma maneira de calcular o ETA, poderei pegar emprestado a CPU i7 do meu pai, que deve processá-lo mais rápido, obviamente, caso contrário, terei que usar um processador mais antigo. .

O problema que estou enfrentando com o comando sort é que sob um VMware player em execução, ele não tem espaço suficiente, por isso preciso especificar arquivos temporários no 32GB USB usando o -T comando. Eu acho que isso não será um problema se eu tiver instalado o Linux.

Então, por favor, me dê o comando completo, seja sed , sort , awk para fazer isso (whichever is most optimal) .

    
por promicin 27.11.2012 / 01:14

3 respostas

7

Use pv para o progresso. Você não precisa de um arquivo temporário, pois está apenas removendo o texto. Apenas sobrescreva o arquivo no lugar. Se o arquivo já estiver classificado, você não precisará de sort -u , apenas uniq .

pv file | {
  uniq | grep -v '^077'
  perl -e 'truncate STDOUT, tell STDOUT'
} 1<> file

A linha perl é truncar o arquivo no ponto em que grep terminou para escrever.

Observe que, como você está escrevendo o arquivo no local, se cometer um erro, não poderá voltar atrás.

    
por 27.11.2012 / 09:46
2

Não tenho certeza se você pode ter ETA ou qualquer exibição de progresso sem aumentar significativamente a complexidade do script sed / awk / shell (e, como resultado, diminuir a velocidade da coisa toda). Se você quer apenas que seja o mais rápido possível, tente cat source_file | uniq | sed -n -e '/^077/!p' > dest_file . Para uma aproximação da exibição de progresso, talvez você queira observar o tamanho crescente do dest_file com esse comando em execução no segundo plano ou em outro terminal.

    
por 27.11.2012 / 08:36
-1
awk '!a[$0]++' "filename" > /tmp/dup
mv -f /tmp/dup "filename"
    
por 24.12.2017 / 09:34