localize o valor máximo da coluna 1 e imprima o respectivo registro da coluna 2 do arquivo

15

Como encontrar o valor máximo da coluna 1 e ecoar o respectivo local do caminho a partir de um arquivo que contenha n números de registros.

$ cat version.log
112030  /opt/oracle/app/oracle/product/11.2.0
121010  /opt/oracle/app/oracle/product/12.1.0

Resultado esperado:

/opt/oracle/app/oracle/product/12.1.0
    
por ABUL KASHIM 27.11.2014 / 05:26

6 respostas

16

Isso deve funcionar:

awk -v max=0 '{if($1>max){want=$2; max=$1}}END{print want} ' version.log

O -v max=0 define a variável max to 0 e, para cada linha, o primeiro campo é comparado ao valor atual de max . Se for maior, max é definido para o valor do primeiro campo e want é definido para a linha atual. Quando o programa processa o arquivo inteiro, o valor atual de want é impresso.

Editar

Eu não testei a solução awk antes e foi muito ruim tê-la fornecido. De qualquer forma, a versão editada da resposta deve funcionar (Obrigado ao terdon por corrigi-la) e eu testei o abaixo também.

sort -nrk1,1 filename | head -1 | cut -d ' ' -f3

Estou sort ing no primeiro campo em que

  • -n especifica classificação numérica.
  • -r especifica reverter o resultado da classificação.
  • -k1,1 especifica o primeiro campo para a classificação ocorrer.

Agora, após a classificação, estou direcionando a saída e obtendo apenas o primeiro resultado, o que me dará o valor numericamente mais alto de column1 no resultado.

Agora, finalmente canalizo para cut com o delimitador especificado como espaço e imprimindo o -f3 que é a saída pretendida.

Teste

cat filename
112030   /opt/oracle/app/oracle/product/11.2.0
121010   /opt/oracle/app/oracle/product/12.1.0
2312     /hello/some/other/path
3423232  /this/is/really/big/number
342      /ok/not/the/maximum/number
9999899  /Max/number
9767     /average/number

Agora, depois de executar o comando acima para a entrada como acima, obtenho a saída como

/Max/number
    
por 27.11.2014 / 05:35
7

Você pode fazer isso com AWK .

$ awk '{if(max<$1){max=$1;line=$2}}END{print line}' file 
/opt/oracle/app/oracle/product/12.1.0

Aqui, a primeira coluna de cada linha é comparada com a variável max (que é inicialmente 0). Se a primeira coluna tiver um valor maior que max , a segunda coluna será armazenada na variável line , e isso continuará para cada linha do arquivo.

No final do arquivo, a regra END é executada para imprimir a variável line .

    
por 27.11.2014 / 05:40
3
awk '$1 > max { max = $1; output = $2 } END { print output }' version.log
    
por 27.11.2014 / 05:36
2

sort -k1 -n filename | tail -1 | awk '{print $2}'

    
por 27.11.2014 / 05:38
2

Você pode classificá-lo usando o comando sort

sort -r version.log | head -n1 | awk '{print $2}'

Saída:

/opt/oracle/app/oracle/product/12.1.0
    
por 27.11.2014 / 05:40
-2
sort -nrk1,1 version.log | head -1 |awk '{print $2}’
    
por 17.12.2017 / 00:26