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

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

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.


4
awk '$1 > max { max = $1; output = $2 } END { print output }' version.log

3

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


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

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}’

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.