
Estoy ejecutando un script (sobre el que no tengo control) para obtener el siguiente resultado. Quiero ordenar por la última (tercera) columna. Cada columna está separada por espacios y la segunda columna incluye espacios/símbolos.
> ./script
37622 (this is || test1)&&(SGD||HKD||RMB) 40010
43944 (this is)&&(SGD||HKD) 102732
79378 (this is||test2)&&(HKD||RMB) 205425
457000 (test2) && (SGD||RMB||HKD||YEN) 71
559658 (test1||test2)&&(RMB||YEN||SGD) 14043
Intenté usar sort -k, pero no funciona. Entonces encontré esta pregunta:¿Cómo ordenar numéricamente por última columna?- la solución proporcionada es
awk '{print $NF,$0}' file.txt | sort -nr | cut -f2- -d' '
Mi pregunta es: ¿cómo hago uso de esto cuando ejecuto el script?
> ./script | <something??>
Gracias.
Respuesta1
awk
Puede adaptar la tubería vinculada de forma sencilla:
$ ./script | awk '{ print $NF,$0 }' | sort -k1,1 -n | cut -f2- -d' '
En awk
la expresión $x
se hace referencia a la x-ésima columna de la línea actual (comenzando con 1) - y la variable predefinida NF
almacena el número de columnas de la línea actual, por lo tanto print $NF,$0
imprime para cada línea la última columna y la línea completa (porque $0
denota la línea completa línea). Luego, el cut
comando genera desde la segunda hasta la última columna de cada línea.
La -k1,1
parte de clasificación significa que solo la primera columna se usa como clave de clasificación; esto solo hace una diferencia cuando más de una línea tiene el mismo valor en la primera columna. Sin -k1,1
las siguientes columnas se influirá en el orden relativo (como clave de clasificación secundaria, etc.) en ese caso. Sólo -k1,1
se utiliza la primera columna como clave de clasificación, y el orden relativo de las líneas con la misma clave no cambia (es decir, se realiza una clasificación estable).
sed
Alternativamente puedes resolverlo vía sort
y sed
:
$ ./script | sed 's/^\(.\+[ \t]\+\)\([0-9]\+ *\)$/\2 \1/' | \
sort -k1,1 -n | sed 's/^\([0-9]\+\) \(.\+\)$/\2 \1/'
Por donde se escapa la nueva línea al final de la primera línea \
, puede eliminarla \
e ingresar a la tubería como una sola línea.
La idea es mover primero la última columna al frente, ordenar por la primera columna y luego volver a colocarla al final.
Se supone que la última columna está separada mediante espacios en blanco, es decir [ \t]\+
(espacios o tabulaciones).
Las sed
expresiones se intercambian mediante referencias de grupo (p. ej. \2 \1
): los grupos se marcan en el patrón mediante paréntesis con escape:\(...\)