¿Es posible ordenar entre dos cadenas en un archivo grande?
Por ejemplo, el archivo actual es como:
0cf Front Brake
0d0 Rear Brake
0ce Handle Bars
HUT 03 VR Controls
009 Vest
001 Belt
002 Body Suit
020 Stereo Enable
003 Flexor
007 Hand Tracker
004 Glove
006 Head Mounted Display
008 Oculometer
00a Animatronic Device
000 Unidentified
021 Display Enable
005 Head Tracker
HUT 04 Sport Controls
000 Unidentified
002 Golf Club
001 Baseball Bat
Y la salida deseada es como:
0ce Handle Bars
0cf Front Brake
0d0 Rear Brake
HUT 03 VR Controls
000 Unidentified
001 Belt
002 Body Suit
003 Flexor
004 Glove
005 Head Tracker
006 Head Mounted Display
007 Hand Tracker
008 Oculometer
009 Vest
00a Animatronic Device
020 Stereo Enable
021 Display Enable
HUT 04 Sport Controls
000 Unidentified
001 Baseball Bat
002 Golf Club
Aquí, la sección HUT 03 VR Controls y HUT 04 Sports Controls está ordenada.
En un archivo dado, los encabezados de sección comienzan con caracteres que no son espacios, mientras que el contenido de la sección siempre comienza con espacio o tabulación. Como este archivo tiene más de 100 secciones, no será posible codificar el nombre de la sección en el script / comando
Respuestas:
En Python:
Esto ordena todas las secciones (por separado), no solo aquellas entre dos líneas específicas.
fuente
Por diversión, aquí hay una manera de ordenar una sola sección usando
ex
:fuente
Esto se usa
awk
para agregar un número (y un separador de tabulación) delante de cada línea correspondiente a la sección en la que se encuentra esta línea. Para los encabezados de sección, agregamos un número seguido de un carácter de retroceso (solo porque el retroceso se ordena antes de las pestañas). Luego, simplemente ordenamos los datos resultantes de estos números antes de eliminarlos y los separadores de pestañas agregados.Los encabezados de sección se detectan al buscar caracteres no en blanco al comienzo de la línea.
fuente
HUT
campo) como prefijo, para ordenar las secciones también.Podrías conseguir
awk
ysort
cooperar para hacer el trabajo.sort
close
ensort
cuando se encuentra un marcador de sección; esto hacesort
que su salida se descargue a la salida estándar y salgasort
toma de control para las líneas de contenido que siguen al marcador de secciónclose
ensort
al final de cuidar de los contenidos de fugafuente
Para tales tareas, a menudo me resulta tedioso escribir un guión. Si solo necesita hacerse una vez y tal vez para algunos archivos, puede hacerse bastante bien usando una macro si abre el archivo
vim
y escribe:GoFAKE SECTION<ESC>
: agregue una sección falsa al final y asegúrese de que esté al comienzo de la línea (puede tenerlacindent
oautoindent
habilitarla). Esto también es necesario para ordenar la última sección.gg
: volver al inicio del archivo, luego el archivo comienza con una sección baja una línea conj
qq
: comienza a grabar una macro para registrar qv
: iniciar selección/^\S\+<Enter>
: busca el inicio de la siguiente secciónk
: hasta una línea:!sort<Enter
: ordenar la secciónnj
: vaya al primer elemento de la siguiente secciónq
: deja de grabar la macro@q
: repite la macro100@@
: repite la macro varias veces (hasta que no queden secciones)dd
: elimina la última línea del archivo (elFAKE SECTION
)Es posible que desee
:set lazyredraw
acelerar la ejecución de macros.fuente