Ordenar una tabla con un separador de registros sin nueva línea en bash

Ordenar una tabla con un separador de registros sin nueva línea en bash

tengo una mesa que se parece

'a;b;f|d;e;c|g;h'

que deseo ordenar por la tercera columna. La salida debe ser

'g;h|d;e;c|a;b;f'

Si tuviera que usar los delimitadores estándar whitespace, newlineesto podría lograrse usando estándar sort:

printf '%b' 'a b f\nd e c\ng h' | sort -k 3

daría salida

g h
d e c
a b f

El sortcomando también puede tomar un separador de campo no estándar con la -topción:

printf '%b' "a;b;f\nd;e;c\ng;h" | sort -k 3 -t ';'

daría salida

g;h
d;e;c
a;b;f

Sin embargo, no pude encontrar una manera de ordenar una tabla con un newlineseparador que no sea de registros.

¿Se puede lograr esto? ¿Si es así, cómo?

Editar

Una condición clave es no alterar ni los datos ni los delimitadores en el proceso, sólo el orden en que aparecen.

Otras herramientas además del sortcomando también están bien. Preferiblemente compatible con POSIX, pero no necesariamente.

Respuesta1

El comando de clasificación solo puede ordenar registros de entrada delimitados por una nueva línea o un carácter NUL como se indica en el manual.

La utilidad de clasificación clasifica archivos de texto y binarios por líneas. Una línea es un registro separado del registro siguiente por una nueva línea (predeterminado) o el carácter NUL '\0'

Por lo tanto, su transformación en algún momento necesitará conocer el delimitador de registros (en su caso |) para llegar al resultado deseado. Cualquier otro comando (Awk/Perl o datamash) tendría que hacer esta suposición


No con una única herramienta independiente, sino con y trpodrías hacerlo. Podrías ver cómo toma forma la transformación agregando un comando a la vez a la canalización.sortpaste

echo 'a;b;f|d;e;c|g;h' | tr '|' '\n' | sort -t';' -k3,3 | paste -sd'|' -

información relacionada