Com o GNU sort ou compatível:
<input.txt sort -k2rn | sort -sbuk1,1 >output.txt
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?
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
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.
Tags text-processing awk sort scripting