msort(1)
fue diseñado para poder ordenar archivos con registros de varias líneas. Tiene una interfaz gráfica de usuario opcional, así como una versión de línea de comando normal y utilizable para humanos. (Al menos, a los humanos que les gusta leer los manuales cuidadosamente y buscar ejemplos ...)
AFAICT, no puede usar un patrón arbitrario para los registros, a menos que sus registros sean de tamaño fijo (en bytes, no en caracteres o líneas). msort
tiene una -b
opción para registros que son bloques de líneas separadas por líneas en blanco.
Puede transformar su entrada en un formato que funcione con -b
bastante facilidad, poniendo una línea en blanco antes de cada ###...
(excepto la primera).
Por defecto, imprime estadísticas en stderr, por lo que al menos es fácil saber cuándo no se ordenó porque pensaba que toda la entrada era un solo registro.
msort
trabaja en tus datos. El sed
comando antepone una nueva línea a cada #+
línea excepto la línea 1. -w
ordena todo el registro (lexicográficamente). Hay opciones para elegir qué parte de un registro usar como clave, pero no las necesitaba.
También dejé de lado las nuevas líneas adicionales.
$ sed '2,$ s/^#\+/\n&/' unsorted.records | msort -b -w 2>/dev/null
####################################
KEY1
VAL11
VAL12
VAL13
VAL14
####################################
KEY2
VAL21
VAL22
VAL23
VAL24
####################################
KEY3
VAL31
VAL32
VAL33
VAL34
No tuve suerte con -r '#'
usar eso como separador de registros. Pensó que todo el archivo era un registro.