com awk
:
$ awk '($2<a[$1] || !a[$1]){a[$1]=$2}END{for(f in a){print f,a[f]}}' file
Orange 2
Banana 1
Apple 3
a[$1]=$2
configura um array chamado a
, cujas chaves são o primeiro campo e cujo valor é o segundo. O script acima salvará o segundo campo como o valor da primeira na matriz se i) for menor que o valor armazenado ou ii) não houver valor armazenado. O bloco END
itera no array, imprimindo seu conteúdo.
Com o GNU sort
:
$ sort -nk2 file | sort -u -k1,1
Apple 3
Banana 1
Orange 2
A primeira classificação imprimirá as linhas em ordem crescente de peso (o segundo campo) e a segunda manterá linhas únicas, mas verifica apenas o primeiro campo. O resultado é que a primeira ocorrência de cada string é impressa e, por causa do primeiro tipo, será o menor valor para essa fruta.
E um Perl (ligeiramente) mais curto:
$ perl -lane '$k{$F[0]}//=$F[1]; $k{$F[0]}=$F[1] if $F[1]<$k{$F[0]};
END{print "$_ $k{$_}" for keys(%k)}' file
Orange 2
Apple 3
Banana 1
O //=
atribuirá um valor a menos que a variável já tenha um. Então, a abordagem é a mesma que a awk
one. Criamos o hash %k
cujas chaves são o fruto e cujos valores são o seu peso, além de salvar o menor valor. O sinal -a
faz com que perl
aja como awk
e divida sua entrada no espaço em branco na matriz @F
.