Remova linhas com base em duplicatas em uma coluna sem classificação


30

Tenho arquivos grandes de 3 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. O tamanho dos arquivos é um pouco complicado, 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

Respostas:


31

Apenas altere seu comando awk para a coluna que você deseja executar para remover linhas duplicadas com base em (no seu caso, terceira coluna):

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

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

O awkcomando acima funcionará se suas colunas no arquivo de entrada forem delimitadas com spaceou Tabentre si, se as colunas forem delimitadas com outra coisa, você precisará dizer para ativar a -Fopção. Portanto, por exemplo, se todas as colunas delimitadas com vírgula ( ,) e quiser remover linhas com base na terceira coluna, use a -F','opção

awk -F',' '!seen[$3]++' filename

18

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

sort -u -t' ' -k3,3 file
  • -u - imprima apenas as linhas exclusivas.
  • -t- especifique o delimitador. Aqui neste exemplo, eu apenas uso o espaço como delimitador.
  • -k3,3 - classifique no terceiro campo.

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


Estava prestes a comentar maliciosamente que -uapenas removeria linhas duplicadas , não chaves duplicadas ... mas estou errado.
Randoms

@ Jamesh faz o trabalho, mas a classificação muda a sequência de linhas que eu acho que nem sempre esperava.
precisa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.