Linux ordena la última columna

Linux ordena la última columna

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 awkla expresión $xse hace referencia a la x-ésima columna de la línea actual (comenzando con 1) - y la variable predefinida NFalmacena el número de columnas de la línea actual, por lo tanto print $NF,$0imprime para cada línea la última columna y la línea completa (porque $0denota la línea completa línea). Luego, el cutcomando genera desde la segunda hasta la última columna de cada línea.

La -k1,1parte 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,1las siguientes columnas se influirá en el orden relativo (como clave de clasificación secundaria, etc.) en ese caso. Sólo -k1,1se 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 sorty 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 sedexpresiones se intercambian mediante referencias de grupo (p. ej. \2 \1): los grupos se marcan en el patrón mediante paréntesis con escape:\(...\)

información relacionada