Ordenar líneas mientras agrupa líneas sangradas con sus padres

Ordenar líneas mientras agrupa líneas sangradas con sus padres

Tengo una lista de líneas similar al índice de un libro, digamos

day
    satur-
    sun-
    holy-
night
    ball
    to-
eve
    election
    christmas

Ahora quiero ordenar estas líneas de la manera obvia: quiero agrupar cada entrada "principal" ( day,, ) con sus respectivas entradas "secundarias" sangradas ( ,, ...) nighty ordenar estos grupos por su entrada principal. También quiero ordenar las entradas secundarias dentro de un grupo determinado.evesatur-sun-

Por tanto, el resultado deseado es:

day
    holy-
    satur-
    sun-
eve
    christmas
    election
night
    ball
    to-

¿Cuál es la mejor manera de lograr esto utilizando herramientas centrales de Unix como sort?

Respuesta1

Puede elegir un carácter que es poco probable que aparezca en su archivo de texto, anteponer el nombre principal + ese carácter a cada línea secundaria, ordenar y luego eliminar el nombre principal y el separador de cada línea secundaria, por ejemplo, con gnused y un carácter ascii bajo como\x02

sed '/^[^[:blank:]]/h;//!G;s/\(.*\)\n\(.*\)/\2\x02\1/' infile | sort | sed 's/.*\x02//'

Cómo funciona:
el primero sedhace lo siguiente:
/^[^[:blank:]]/h- copiar líneas sin sangría (principales) sobre el espacio de retención
//!G- en líneas sangradas (hijos) agregar el contenido del espacio de retención al espacio del patrón
s/\(.*\)\n\(.*\)/\2\x02\1/- intercambiar líneas en el espacio del patrón reemplazando la \nlínea ewline con \x02
después de eso, sorty eliminar todo hasta e incluyendo \x02un segundosed 's/.*\x02//'

información relacionada