Clasificar con espacios en blanco desiguales en la primera columna

Necesito orderar esta list por nombre, temperatura alta y baja temperatura:

Kuala Lumpur 78 56 Seoul 85 66 Karachi 95 75 Tokyo 85 60 Lahore 85 75 Manila 90 85 

Pensé que dado que el espacio en blanco es el delimitador de una columna, podría sort -k 1 que me da esto:

 Karachi 95 75 Kuala Lumpur 78 56 Lahore 85 75 Manila 90 85 Seoul 85 66 Tokyo 85 60 

Pero el "Kuala Lumpur" está causando problemas debido al espacio.

Así que traté de tratar a "Lumpur" como una columna y orderar el primer grupo de nums que hice

 sort -k 3n 

pero entiendo esto:

 Tokyo 85 60 Seoul 85 66 Karachi 95 75 Lahore 85 75 Kuala Lumpur 78 56 <---Why is this out of order? Manila 90 85 

¿Cómo trato con este espacio?

Solutions Collecting From Web of "Clasificar con espacios en blanco desiguales en la primera columna"

Como otros han comentado, será más fácil trabajar con los datos si se trata de valores separados por comas (CSV).

Aquí está mi solución para convertir los datos a CSV:

 $ cat file | sed 's/ \([0-9]\)/,\1/g' Kuala Lumpur,78,56 Seoul,85,66 Karachi,95,75 Tokyo,85,60 Lahore,85,75 Manila,90,85 

Reemplaza cualquier espacio que precede a un dígito con una coma. \1 reference al grupo ([0-9]), el dígito después del espacio. Desde allí, puede usar sort con el argumento -t para especificar un separador de campo.

 $ cat file | sed 's/ \([0-9]\)/,\1/g' | sort -t, -k2 Kuala Lumpur,78,56 Tokyo,85,60 Seoul,85,66 Lahore,85,75 Manila,90,85 Karachi,95,75 

Si desea convertir de nuevo a espacios o hacer una tabla, aquí hay dos ejemplos:

 $ cat test | sed 's/ \([0-9]\)/,\1/g' | sort -t, -k2 | tr , ' ' Kuala Lumpur 78 56 Tokyo 85 60 Seoul 85 66 Lahore 85 75 Manila 90 85 Karachi 95 75 $ cat test | sed 's/ \([0-9]\)/,\1/g' | sort -t, -k2 | column -s, -t Kuala Lumpur 78 56 Tokyo 85 60 Seoul 85 66 Lahore 85 75 Manila 90 85 Karachi 95 75 
 awk '{print $NF,$0}' file.txt | sort -nr -k1 | cut -d' ' -f2- 
  • $NF : cantidad de campos, $0 : línea completa
  • sort -nr : numérico en reversa (descendente)
  • sort -k1 : orderar por primera columna (delimitada por secuencias de espacios y tabs)
  • cut -d : delimiter (pnetworkingeterminado en la pestaña)
  • cut -f2- : campos 2 a último (no queuepsar ni desmarcar delimitadores)
 ruby -e 'puts readlines.sort_by{|l|l.split[-1].to_i}.reverse' file.txt 
  • readlines = ARGF.readlines
  • split divisiones en espacios en blanco por defecto

Si puede cambiar su file para tener columnas separadas por tabuladores, su vida será más fácil. Si cambiar el file no es una opción, este Perl one-liner lo hará por usted:

 perl -ne 's/\s+/\t/g; s/([az])\s([az])/$1 $2/ig; s/\t$/\n/; print;' file | sort -t$'\t' -nk3 Kuala Lumpur 78 56 Tokyo 85 60 Seoul 85 66 Karachi 95 75 Lahore 85 75 Manila 90 85 

EXPLICACIÓN:

  • s/\s+/\t/g : cambia TODOS los espacios a TAB.
  • s/([az])\s([az])/$1 $2/ig : cambia las TAB que están entre dos letras (sin numbers) a espacios únicos.
  • s/\t$/\n/ : la primera sustitución introduce una TAB al final de cada línea, cambia eso a un carácter de nueva línea ( \n ).

  • sort -t$'\t' -nk3 : usar TAB como delimitador (la orderación tiene una syntax extraña, lo sé, ver aquí para más información) y orderar numéricamente en la tercera columna.