Remove linhas baseadas em duplicatas dentro de uma coluna sem ordenar

26

Eu tenho arquivos grandes de três colunas (~ 10.000 linhas) e gostaria de remover linhas quando o conteúdo da terceira coluna dessa linha aparecer na terceira coluna de outra linha. Os tamanhos dos arquivos tornam a tarefa um pouco trabalhosa, e não posso usar algo como o código abaixo porque as linhas inteiras não são idênticas; apenas o conteúdo da coluna 3.

awk '!seen[$0]++' filename
    
por Zach C 02.12.2014 / 17:37

2 respostas

25

Basta alterar seu comando awk para a coluna que deseja executar para remover linhas duplicadas com base em (na sua terceira coluna):

awk '!seen[$3]++' filename

Este comando informa awk de quais linhas imprimir. A variável $3 contém todo o conteúdo da coluna 3 e os colchetes são o acesso à matriz. Portanto, para cada terceira coluna da linha no nome do arquivo, o nó da matriz denominada seen é incrementado e a linha impressa se o conteúdo desse nó (coluna3) não foi ( ! ) definido anteriormente.

Acima o comando awk funcionará se suas colunas no arquivo de entrada estiverem delimitadas com space ou Tab entre elas, se as colunas forem delimitadas por outra coisa, você precisará informar ao awk com sua opção -F . Portanto, por exemplo, se todas as colunas delimitadas com vírgula ( , ) e quiser remover linhas base na terceira coluna, use a opção -F',' .

awk -F',' '!seen[$3]++' filename
    
por 02.12.2014 / 18:31
14
O comando

sort já está otimizado para lidar com arquivos grandes. Então, você poderia muito bem usar o comando sort no seu arquivo como,

sort -u -t' ' -k3,3 file
  • -u - imprime somente as linhas exclusivas.
  • -t - especifica o delimitador. Aqui neste exemplo, apenas uso o espaço como delimitador.
  • -k3,3 - classifica no terceiro campo.

Você pode consultar esta resposta que sugere que a classificação GNU é, na verdade, a melhor abordagem para classificar grandes arquivos . No seu caso, acho que mesmo sem -parallel , você poderia alcançar seu resultado final sem muito atraso de tempo.

    
por 02.12.2014 / 17:47