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