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

19

Como encontrar o valor máximo da coluna 1 e ecoar o local do caminho respectivo de um arquivo que contém n número de registros.

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

Saída esperada:

/opt/oracle/app/oracle/product/12.1.0
ABUL KASHIM
fonte

Respostas:

23

Isso deve funcionar:

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

Os -v max=0conjuntos da variável maxpara 0, em seguida, para cada linha, o primeiro campo é comparado com o valor corrente de max. Se for maior, maxé definido como o valor do 1º campo e wanté definido como a linha atual. Quando o programa processa o arquivo inteiro, o valor atual de wanté impresso.

Editar

Eu não testei a awksolução anteriormente e foi realmente ruim ter 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 sortno primeiro campo em que,

  • -n especifica a 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 canalizando a saída e obtendo o primeiro resultado, o que me dará o valor numericamente mais alto da coluna1 no resultado.

Agora, finalmente conecto-o ao cutdelimitador especificado como espaço e imprimo o -f3que é 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, recebo a saída como,

/Max/number
Ramesh
fonte
O awk max não compara o campo da string numericamente. foi por isso que você deu uma segunda abordagem?
Sajuuk 24/05
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 que, em maxseguida, a segunda coluna será armazenada na variável line, isso continuará para cada linha do arquivo.

No final do arquivo, a ENDregra é executada para imprimir a linevariável.

Kannan Mohan
fonte
4
awk '$1 > max { max = $1; output = $2 } END { print output }' version.log
jw013
fonte
3

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

Mandar Shinde
fonte
1
Isso deve funcionar, mas é ineficiente, porque a classificação é um exagero quando a tarefa é encontrar um máximo.
Jw013 27/11/2014
2

Simplesmente você pode classificá-lo usando o sortcomando

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

Resultado:

/opt/oracle/app/oracle/product/12.1.0
Besta de Segurança
fonte
você deseja imprimir o segundo valor, apenas tente este cat version.log | classificar -r | cabeça -n1 | awk -F "" '{Print $ 2}' '
Security Beast
Por favor, não poste capturas de tela do seu terminal. Basta colar o texto. Além disso, não há necessidade cat, a classificação pode levar os arquivos de entrada diretamente.
terdon
-2
sort -nrk1,1 version.log | head -1 |awk '{print $2}’
Spidey Praful
fonte
2
Parece um re-hash da resposta aceita? Por favor, explique como isso difere.
Stephen Rauch
De fato, pelo menos, dê crédito ao autor original.
Jeff Schaller