É possível classificar entre duas strings em um arquivo grande?
por exemplo, o arquivo atual é 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
E a saída desejada é 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
Aqui, a seção HUT 03 VR Controls e HUT 04 Sports Controls é resolvida.
Em um determinado arquivo, os cabeçalhos de seção começam com caracteres sem espaço, enquanto o conteúdo da seção sempre começa com espaço ou tabulação. Como este arquivo tem mais de 100 seções, não será viável codificar o nome da seção no script/comando
Em Python:
Isso classifica todas as seções (separadamente), não apenas aquelas entre duas linhas específicas.
Isso usa
awk
para adicionar um número (e um separador de tabulação) na frente de cada linha correspondente à seção em que esta linha está. Para cabeçalhos de seção, adicionamos um número seguido por um caractere de retrocesso (apenas porque o retrocesso classifica antes de tabulações). Em seguida, simplesmente classificamos os dados resultantes nesses números antes de removê-los e os separadores de tabulação adicionados.Os cabeçalhos de seção são detectados procurando por caracteres não em branco no início da linha.
Para se divertir, aqui está uma maneira de classificar uma única seção usando
ex
:Você poderia obter
awk
esort
cooperar para fazer o trabalho.sort
close
quandosort
um marcador de seção for encontrado; isso fazsort
com que sua saída seja liberada para a saída padrão e saiasort
assume as linhas de conteúdo após o marcador de seçãoclose
nosort
final para cuidar do conteúdo finalPara essas tarefas, muitas vezes acho tedioso escrever um script. Se isso só precisa ser feito uma vez e talvez para alguns arquivos, isso pode ser feito muito bem usando uma macro se você abrir o arquivo
vim
e digitar:GoFAKE SECTION<ESC>
: adicione uma seção falsa no final e verifique se está no início da linha (você pode tercindent
ouautoindent
habilitado). Isso é necessário para classificar a última seção também.gg
: de volta vai para o início do arquivo, então o arquivo começa com uma seção desce uma linha comj
qq
: começar a gravar uma macro para registrar qv
: iniciar a seleção/^\S\+<Enter>
: procure o início da próxima seçãok
: subir uma linha:!sort<Enter
: classificar a seçãonj
: vá para o primeiro elemento da próxima seçãoq
: parar de gravar a macro@q
: repita a macro100@@
: repita a macro algumas vezes (até não restar nenhuma seção)dd
: exclui a última linha do arquivo (oFAKE SECTION
)Você pode querer
:set lazyredraw
acelerar a execução da macro.