Como comparar uma parte da string numericamente e depois imprimir a linha correspondente?

1

Suponha que eu tenha essas linhas para alimentar awk :

dolly-cabinet-93-red
murfy-swan-96-white
chizzle-rock-115-green

Como seleciono a linha cortada por - cuja terceira coluna é a maior (numericamente) e imprime a linha (preferencialmente usando awk , mas não limitado a)?

De alguma forma, a solução que eu acho 96 é a maior.

    
por Sajuuk 24.05.2018 / 08:33

2 respostas

2

Suponho que você esteja fazendo algum tipo de classificação, e que essa classificação seja feita de forma lexicográfica, em vez de numericamente; nesse caso, 96 seria classificado após 115 (pois 9 vem depois de 1 ).

awk -F '-' '$3 > max { max = $3; line = $0 } END { print line }' file

Para os dados fornecidos, isso produzirá

chizzle-rock-115-green

O código compara o terceiro campo - -delimited com o maior número encontrado atual ( max ). Se o número do campo for maior, max será atualizado com esse número e a linha de entrada atual será salva em line . No final, o conteúdo de line é impresso.

Isso é um pouco mais rápido do que a classificação, pois é uma operação linear (a classificação é na melhor das hipóteses O(n*log(n)) ), mas você não notará uma grande diferença, a menos que tenha grandes quantidades de dados.

    
por 24.05.2018 / 08:39
2

Abordagem alternativa com sort + head :

sort -t'-' -k3nr file | head -1

A saída:

chizzle-rock-115-green
    
por 24.05.2018 / 08:51