Encuentre el valor máximo de la Columna 3 e imprima los valores de las Columnas 1 y 2 únicamente

Encuentre el valor máximo de la Columna 3 e imprima los valores de las Columnas 1 y 2 únicamente

En Unix, estoy tratando de encontrar un comando que encuentre el valor máximo en la Columna 3 e imprima los valores correspondientes de la Columna 2 y la Columna 1 (pero no de la Columna 3) en un archivo nuevo.

 Column1     Column2     Column3
   A          1          25
   B          2          6
   C          3          2
   D          4          16
   E          5          10

¿Cuál debería ser el comando de Unix? ¿Debo usar grep o awk o datamash?

Respuesta1

Yo usaría awk. Suponiendo que los datos tienen el formato exacto según los datos de muestra, lo siguiente producirá el resultado deseado:

awk -v MAX=0 '{ if(NR>1 && $3>MAX){WANT1=$1; WANT2=$2; MAX=$3}} END{print WANT1, WANT2}' infile > outfile

Respuesta2

Suponiendo que sus datos tienen el formato exactamente como usted lo indicó (esto se aplica especialmente a la tercera columna, los números están alineados a la izquierda) y que estos datos se proporcionan mediante catun archivo, puede probar este comando:

*input generating command* | sort -nrk3 | awk '{print $1 " " $2}' > output_file

En caso de que sus datos sean proporcionados por algún otro comando o fuente, cambie cata ese otro comando. Para más información, veresta publicaciónque básicamente adapté a tus necesidades.

Editar:

Cambié ligeramente el comando anterior ya que no es necesario indicar sortque se debe comenzar desde el carácter 1 de la columna 3, ya que sort siempre trata un espacio en blanco como un separador. Por supuesto, sorttambién se puede enviar el archivo de entrada directamente, como señaló un usuario. Si también los encabezados son parte de sus datos, cambie el comando anterior a:

*input generating command* | sort -nrk3 | awk '{if (NR>1) print $1 " " $2}' > output_file

Respuesta3

awk '{if(NF>2 && $3>M){M=$3;print $1,$2} }' file1 | tail -1 > file2

información relacionada