Exibe a linha mais recente por chave

3

Eu tenho um arquivo contendo vários campos:

12345 some values here
67890 other values maybe
12345 different values here

... etc.

Gostaria de exibir a linha mais recente para cada chave. A saída deve ser a seguinte:

67890 other values maybe
12345 different values here

Na saída, as chaves devem ser exclusivas e os valores (o restante da linha) devem ser os mais recentes para essa chave. Eu particularmente não me importo com a ordem resultante das chaves.

Como posso fazer isso usando ferramentas GNU (ou POSIX)?

    
por Roger Lipscombe 14.08.2018 / 18:10

2 respostas

1
awk '{ data[$1] = $0 } END { for (key in data) print data[key] }' file

Isso salvaria os dados de cada linha no array data , digitado no primeiro campo. Quando outra linha com o mesmo primeiro campo é encontrada, os dados antigos dessa chave são simplesmente sobrescritos.

No final, todos os dados da matriz são exibidos.

Mais eficiente de memória:

sort -k1,1 -s file |
awk 'NR > 1 && $1 != key { print data } { data = $0; key = $1 } END { print data }'

Aqui, primeiro classificamos o arquivo apenas na primeira coluna, usando um algoritmo de classificação estável ( -s ). Usar um algoritmo de classificação estável significa que as linhas com a mesma chave não mudarão de posição em relação uma à outra na saída de sort .

O código awk só precisa manter o controle da "chave atual" e os dados mais recentes para essa chave, e para imprimir esses dados quando a chave for alterada (e no final).

    
por 14.08.2018 / 18:18
0

Eu inverteria o arquivo, mostraria cada linha da primeira vez que ela é vista, e então inverteria a saída

tac file | awk '!seen[$1]++' | tac
    
por 14.08.2018 / 20:07