Imprime apenas linhas com maior valor [duplicado]

0

Eu preciso processar um arquivo como abaixo no script bash:

input.txt:

host1 53
host1 123
host2 0
host1 222
host3 1
host1 85
host1 25
host1 13
host3 8
host2 90

Eu preciso de obter nos resultados apenas uma linha para cada host com base no máximo valor na coluna 2:

output.txt:

host1 222
host2 90
host3 8

Alguma idéia?

    
por Scyld de Fraud 07.03.2018 / 11:56

3 respostas

6

Com o GNU sort ou compatível:

<input.txt sort -k2rn | sort -sbuk1,1 >output.txt
    
por 07.03.2018 / 12:05
5

O mais curto com o GNU datamash :

datamash -sW -g1 max 2 <file
  • -s - ordena a entrada antes de agrupar
  • -W - use espaço em branco (um ou mais espaços e / ou tabulações) para delimitadores de campo
  • -g 1 - grupo pelo 1º campo
  • max 2 - operação numérica para obter o valor máximo do 2º campo por grupo

A saída:

host1   222
host2   90
host3   8
    
por 07.03.2018 / 12:02
3

Aqui está o one-liner awk:

$ awk '{if (a[$1] == "" || $2 > a[$1]) a[$1] = $2} END { for (k in a) print k, a[k] }' < input.txt
host1 222
host2 90
host3 8

$1 e $2 são os dois primeiros campos da linha, a matriz associativa a[k] contém o máximo atual da chave k . Com o teste contra a[$1] sendo vazio, ele deve lidar corretamente com números negativos.

    
por 07.03.2018 / 12:18