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 sort
página del manual, esto podría no ser posible con el sort
comando incorporado de UNIX . ¿O incluso puede hacerse sin tener que recurrir a herramientas externas / de terceros?
fuente
awk
solución que evita lossort
gastos generales! ¡Furtivo!Establecer el separador de registros
RS
en 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 hacemossplit
eso\n\n
(párrafos).foreach
"párrafo",sort
las líneassplit
marcando alrededor de las nuevas líneas,sort
ing y luegojoin
volviendo 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/sort
con esa línea o es unawk
comando "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
\0
char, 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 reemplazarsort
por 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.