Você pode usar o awk para acompanhar os primeiros campos que já viu:
awk '!seen[$1]++' infile
Isso usa um hash, seen
, digitado pelo primeiro campo ( $1
). Verificamos se o valor pós-incrementado de seen[$1]
é falso, ou seja, quando encontramos um novo valor, seen[$1]++
retorna 0 e !seen[$1]++
é verdadeiro; se já vimos o valor seen[$1]++
retorna algo maior que 0 e !seen[$1]++
é falso.
A operação padrão para quando a condição é verdadeira é imprimir a linha inteira ( { print $0 }
), que é o que queremos aqui, então não precisamos explicá-la.
Isso faz o mesmo, de maneira mais detalhada, mas mais fácil de entender:
awk 'seen[$1] == 0 {
++seen[$1]
print $0
}' infile