É 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 é a seguinte:
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 é classificada.
Em um determinado arquivo, os cabeçalhos da seção começam com caracteres que não são espaços, enquanto o conteúdo da seção sempre começa com espaço ou tabulação. Como esse arquivo tem mais de 100 seções, não será possível codificar o nome da seção no script / comando
Respostas:
Em Python:
Isso classifica todas as seções (separadamente), não apenas aquelas entre duas linhas específicas.
fonte
Para se divertir, aqui está uma maneira de classificar uma única seção usando
ex
:fonte
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 os cabeçalhos das seções, adicionamos um número seguido de um caractere de backspace (apenas porque o backspace é classificado antes das guias). Em seguida, simplesmente classificamos os dados resultantes nesses números antes de removê-los e os separadores de tabulação adicionados.Os cabeçalhos das seções são detectados procurando caracteres não em branco no início da linha.
fonte
HUT
campo) como prefixo, para classificar as seções também.Você pode obter
awk
esort
cooperar para fazer o trabalho.sort
close
emsort
quando um marcador de seção é encontrado; isso fazsort
com que libere sua saída para saída e saída padrãosort
controle para as linhas de conteúdo após o marcador de seçãoclose
nosort
final para cuidar do conteúdo à direitafonte
Para tais tarefas, muitas vezes acho entediante escrever um script. Se ele precisar ser feito apenas uma vez e talvez com alguns arquivos, poderá ser feito com bastante bom gosto 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
: voltar, vá para o início do arquivo e, em seguida, o arquivo começa com uma seção, desça uma linha comj
qq
: começa a gravar uma macro para registrar qv
: inicia seleção/^\S\+<Enter>
: procure o início da próxima seçãok
: até uma linha:!sort<Enter
: classifica 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 sobrarem seções)dd
: exclua a última linha do arquivo (theFAKE SECTION
)Convém
:set lazyredraw
acelerar a execução da macro.fonte