Это кажется безумием, и надеюсь, что есть лучший способ, но:
tac foo | sort -k 1,1 -u
tac
используется для переверстывания файла, так что вы получаете последний, а не первый.
-k 1,1
говорит использовать для сравнения только первое поле.
-u
делает его уникальным.
Если вы не возражаете против порядка вывода, вот решение awk
:
$ awk '
{a[$1] = !a[$1] ? $2 : a[$1] < $2 ? $2 : a[$1]}
END {
for (i in a) { print i,a[i] }
}
' file
hi 2
hello 67
ho 3000
Еще несколько вариантов:
perl
, если вас не волнует порядок следования строк.
perl -lane '$k{$F[0]}=$F[1]; END{print "$_$k{$_}" для файла ключей(%k)}".
Проще awk
awk '{c[$1] = $0;} END{for(i in c){print c[i]}}' file
Глупая оболочка
, когда читаешь a b; do grep -w ^"$a" file | tail -n1 ; done < file | uniq