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
, newline
esto 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 sort
comando también puede tomar un separador de campo no estándar con la -t
opció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 newline
separador 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 sort
comando 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 tr
podrías hacerlo. Podrías ver cómo toma forma la transformación agregando un comando a la vez a la canalización.sort
paste
echo 'a;b;f|d;e;c|g;h' | tr '|' '\n' | sort -t';' -k3,3 | paste -sd'|' -