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 ( ,, ...) night
y ordenar estos grupos por su entrada principal. También quiero ordenar las entradas secundarias dentro de un grupo determinado.eve
satur-
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 gnu
sed 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 sed
hace 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 \n
línea ewline con \x02
después de eso, sort
y eliminar todo hasta e incluyendo \x02
un segundosed 's/.*\x02//'