Ordenar linhas ao agrupar linhas recuadas com seus pais

3

Eu tenho uma lista de linhas com o índice de um livro, digamos

day
    satur-
    sun-
    holy-
night
    ball
    to-
eve
    election
    christmas

Agora, quero classificar essas linhas da maneira óbvia: desejo agrupar todas as entradas "pai" ( day , night , eve ) com suas respectivas entradas "filho" recuadas ( satur- , sun- ,…) e classifique esses grupos por sua entrada pai. Eu também quero classificar as entradas de crianças dentro de qualquer grupo.

Assim, a saída desejada é:

day
    holy-
    satur-
    sun-
eve
    christmas
    election
night
    ball
    to-

Como eu poderia conseguir isso usando ferramentas básicas do Unix como sort ?

    
por k.stm 24.05.2017 / 00:03

1 resposta

4

Você poderia escolher um caractere que provavelmente não ocorreria em seu arquivo de texto, preceder o nome do pai + o caractere a cada linha filho, classificar e depois remover o nome pai e o separador de cada linha filho, por exemplo. com gnu sed e um caracter baixo ascii como \x02

sed '/^[^[:blank:]]/h;//!G;s/\(.*\)\n\(.*\)/\x02/' infile | sort | sed 's/.*\x02//'

Como funciona:
o primeiro sed faz o seguinte:
/^[^[:blank:]]/h - copiar linhas não recuadas (pais) sobre espaço de espera
//!G - em linhas recuadas (filhos) anexar espaço de retenção de conteúdo ao espaço padrão s/\(.*\)\n\(.*\)/\x02/ - troca linhas no espaço padrão substituindo o \n ewline por \x02
depois disso, sort e remova tudo até e incluindo \x02 com um segundo sed 's/.*\x02//'

    
por 24.05.2017 / 00:26

Tags