Classifique o FileA no FileB enquanto remove ativamente as linhas do FileA

1

Eu tentei simplificar o título, desculpas se for um pouco confuso.

Eu tenho um arquivo de texto grande (Arquivo A) (em torno de 13GB) e quero classificá-lo (no Arquivo B) para excluir linhas duplicadas. O problema é que tenho uma quantidade limitada de espaço, por isso não posso criar um arquivo com o mesmo tamanho. Existe uma maneira de excluir ativamente as linhas classificadas do Arquivo A?

Meu código de classificação: awk ' !x[$0]++' FileA.lst > FileB.lst

    
por Matthew Taylor Kelley 01.12.2013 / 00:19

2 respostas

1

Resposta simples: linhas duplicadas consecutivas

Para edição no local, sed é a ferramenta de escolha. Para remover linhas duplicadas consecutivas, use isto:

 sed '$!N; /^\(.*\)\n$/!P; D'

Não é tão simples: linhas duplicadas não consecutivas

Se as linhas duplicadas não são consecutivas, você pode usar isso - mas há um risco de excesso de espaço no buffer:

 sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n/d; s/\n//; h; P'

Como sort usa o algoritmo Merge Sort (assumindo o GNU sort normalmente usado no Linux), o risco de ficar sem memória ou disco permanece, porque o Merge Sort pode usar muito espaço auxiliar no pior caso. situações. Além desse risco, @thom está correto sugerindo sort -u .

Se o problema for remover linhas duplicadas não consecutivas, e houver o risco de que sed ou um sort no local possam ficar sem espaço devido à pior das hipóteses, a melhor solução é provavelmente mova o arquivo para algum tipo de armazenamento externo, como uma unidade flash USB.

Observe que, se você não souber se o sed ou sort pode ficar sem espaço e corromper o arquivo, você realmente deseja fazer o backup do arquivo, de uma forma ou de outra. Outra solução pode ser classificar o sistema de arquivos para arquivos grandes que podem ser compactados e compactar o suficiente para executar o awk '!x[$0]++' inFile > outFile ou sort -u com segurança, em um arquivo separado. Então você não perderá dados se o comando falhar.

Veja também "Scripts úteis de uma linha para sed ": link

    
por Steve 27.09.2014 / 01:40
0

Tanto quanto sei, o programa sort pode classificar 'inplace', o que significa que você pode usar o mesmo arquivo para entrada e saída. sort -u removerá linhas duplicadas.

o comando seria:

sort -u mylargefile mylargefile

Pode, é claro, ser aconselhável testá-lo primeiro em um arquivo de teste menor antes de começar a fazer a coisa real. Especialmente se você não tiver um backup desse arquivo de 13 GB

    
por thom 01.12.2013 / 00:43