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 cat
un 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 cat
a 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 sort
que 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, sort
tambié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