encuentre el valor máximo de la columna 1 e imprima el registro respectivo de la columna 2 del archivo


19

Cómo encontrar el valor máximo de la columna 1 y hacer eco de la ubicación de la ruta respectiva de un archivo que contiene 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

Rendimiento esperado:

/opt/oracle/app/oracle/product/12.1.0

Respuestas:


23

Esto debería funcionar:

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

Los -v max=0establece la variable maxa 0y, a continuación, para cada línea, el primer campo se compara con el valor actual de max. Si es mayor, maxse establece en el valor del primer campo y wantse establece en la línea actual. Cuando el programa ha procesado todo el archivo, wantse imprime el valor actual de .

Editar

No probé la awksolución antes y fue realmente malo haberla proporcionado. De todos modos, la versión editada de la respuesta debería funcionar (Gracias a terdon por solucionarlo) y probé también la siguiente.

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

Estoy sorten el primer campo donde,

  • -n especifica la ordenación numérica.
  • -r especifica revertir el resultado de la ordenación.
  • Especifica -k1,1 primer campo para la clasificación de que se produzca.

Ahora, después de la clasificación, estoy canalizando la salida y obteniendo el primer resultado que me dará el valor numéricamente más alto de la columna1 en el resultado.

Ahora, finalmente lo canalizo cutcon el delimitador especificado como espacio e imprimo -f3cuál es el resultado deseado.

Pruebas

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

Ahora, después de ejecutar el comando anterior para la entrada como se muestra arriba, obtengo la salida como,

/Max/number

awk max no compara el campo de cadena numéricamente. es por eso por lo que le dio un segundo enfoque?
Sajuuk

7

Puedes hacerlo con AWK.

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

Aquí la primera columna de cada línea se compara con la variable max(que inicialmente es 0). Si la primera columna tiene un valor mayor que maxla segunda columna se almacena en la variable line, esto continúa para todas y cada una de las líneas del archivo.

Al final del archivo, la ENDregla se ejecuta para imprimir la linevariable.


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

3

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


1
Esto debería funcionar, pero es ineficiente, porque la clasificación es excesiva cuando la tarea es encontrar un máximo.
jw013

2

Simplemente se puede solucionar el problema mediante el uso sortde comandos

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

Salida:

/opt/oracle/app/oracle/product/12.1.0

desea imprimir el segundo valor solo intente este gato version.log | sort -r | n1 cabeza | awk -F "" '{Print $ 2}'
Security Beast

Por favor, hacer capturas de pantalla no post de su terminal. Sólo tienes que pegar el texto en su lugar. Además, no es necesario cat, sort puede tomar archivos de entrada directamente.
terdon

-2
sort -nrk1,1 version.log | head -1 |awk '{print $2}’

2
Esto parece un refrito de la respuesta aceptada? Por favor, explique cómo se diferencia.
Stephen Rauch

De hecho, en el crédito lo menos dar al autor original.
Jeff Schaller
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.