Creo que ahora tengo bastante experiencia en ordenar por columnas ; Sin embargo, no he encontrado nada hasta ahora sobre cómo ordenar filas continuas .
Supongamos que tenemos un archivo de texto que se ve así: (muy simplificado, por supuesto)
Echo
Alpha
Delta
Charlie
Golf
Bravo
Hotel
Foxtrot
Ahora, ¿es posible ordenar las líneas alfanuméricamente por cada bloque por separado ? Quiero decir, para que el resultado se vea así:
Alpha
Charlie
Delta
Echo
Bravo
Foxtrot
Golf
Hotel
Según lo que encontré en la sortpágina del manual, esto podría no ser posible con el sortcomando incorporado de UNIX . ¿O incluso puede hacerse sin tener que recurrir a herramientas externas / de terceros?
fuente

awksolución que evita lossortgastos generales! ¡Furtivo!Establecer el separador de registros
RSen una cadena vacía hace un paso difícil en los párrafos a la vez. Para cada párrafo, canalice el párrafo (in$0) a cmd (que se establece ensort) e imprima la salida. Imprima una línea en blanco para separar los párrafos de salida con aprint "".Si damos ejemplos de Perl, entonces presento un enfoque alternativo al de Stephane:
Desarma el separador de campo (
undef $/), esto nos permite usar<>y obtener todo el STDIN. Luego hacemosspliteso\n\n(párrafos).foreach"párrafo",sortlas líneassplitmarcando alrededor de las nuevas líneas,sorting y luegojoinvolviendo a juntarlas y añadiendo un final\n.Sin embargo, esto tiene un efecto secundario al agregar un separador de "párrafo final" en el último párrafo (si no tenía uno antes). Puedes evitar eso con un poco menos bonito:
Esto asigna los párrafos a
@list, y luego hay una "operación ternaria" para verificar si es el último elemento deforeach(la\$_ == \$list[-1]verificación). print""si es (? ...), else (: ...) imprime"\n"para todos los demás "párrafos" (elementos de@list).fuente
/usr/bin/sortcon esa línea o es unawkcomando "ordenar" incorporado?Escribí una herramienta en haskell que te permite usar sort, shuf, tac o cualquier otro comando en párrafos de texto.
https://gist.github.com/siers/01306a361c22f2de0122
EDITAR: la herramienta también se incluye en este repositorio: https://github.com/siers/haskell-import-sort
Divide el texto en bloques, une los subbloques con
\0char, canaliza a través del comando y finalmente hace lo mismo a la inversa.28-08-2015 : Encontré otro uso personal para esta herramienta: seleccionar N párrafos después de una línea.
fuente
Si tiene GNU awk disponible, puede ordenar cada bloque utilizando la
asort()función incorporada. Algo como esto:blocksort.awk
Ejecútelo así:
fuente
TXR Lisp paso a paso:
Referencias: get-lines , partición * , op , where , chain , length , zerop , mapcar , interpose .
fuente
[mapcar sort ...]podríamos reemplazarsortpor una función que canaliza las cadenas a través de un proceso externo. Entonces podemos terminar con una herramienta para distribuir un comando externo de procesamiento de texto sobre párrafos.