bash scripts - remove linhas duplicadas com menor valor

1

Aqui está um arquivo de exemplo:

1 5 20 40 60
2 1 20 20 20
2 2 30 30 30
4 5 40 40 40
7 2 50 30 30
7 1 20 20 20

Eu gostaria de remover linhas duplicadas (com o mesmo valor na primeira coluna) com um valor maior na segunda coluna. Eu quero deixar apenas linhas com valores uniqe na primeira coluna. Neste caso, eu tenho linhas duplicadas:

2 1 20 20 20
2 2 30 30 30

e

7 2 50 30 30
7 1 20 20 20

Eu gostaria de remover linhas com valores maiores na segunda coluna, neste caso:

2 2 30 30 30

e

7 2 50 30 30

Assim, meu objetivo é selecionar e gerar o seguinte arquivo:

1 5 20 40 60
2 1 20 20 20
4 5 40 40 40
7 1 20 20 20

Suponho que consegui fazer isso no awk:

sort -nk2 | awk '{if(a[$1]){a[$1]=a[$1] } else {a[$1]=$0}}END{for (k in a) {print a[k]}}' | sort

No entanto, funciona em arquivos pequenos. Como posso substituí-lo por algo mais eficiente (para arquivo com quase um milhão de linhas)?

    
por user66193 26.04.2014 / 01:29

1 resposta

1

Você pode fazer isso com sort . A seguir, as primeiras ordens de sort em ordem crescente da coluna 1 seguidas pela coluna 2. Isso é então canalizado para um segundo sort que seleciona um registro para cada valor distinto na coluna 1. O -s (estável O flag sort) é passado para garantir que apenas o primeiro registro para cada valor da coluna 1 seja retornado, o que, por causa do tipo anterior, é o registro com o menor valor na coluna 2.

sort -k1,1n -k2,2n file | sort -k1,1n -s -u
    
por 26.04.2014 / 02:16