Classificando algumas linhas em um arquivo

1

1. Resumo

Eu não entendo como posso classificar linhas em alguns lugares do arquivo, não em todos os arquivos.

Seria bom, se fosse possível resolver essa tarefa, qualquer método gratis.

2. Configurações

1. Estrutura do arquivo

Eu tenho um arquivo grande (19 MB) SashaMillionaire.md , tem perguntas de um jogo . Consiste em repetir blocos. Cada bloco tem 10 linhas. Estrutura do arquivo (usando expressões regulares PCRE)

Millionaire
\d{18}
QUESTION.*
.*
.*
.*
.*
.*
.*
.*
Millionaire
\d{18}
QUESTION.*
.*
.*
.*
.*
.*
.*
.*

SashaMillionaire.md não tem outras linhas e texto além de blocos de 10 linhas. Não possui linhas e blocos em branco com um número maior ou menor de linhas que 10.

2. Exemplo de conteúdo do arquivo

Millionaire
123456788763237476
QUESTION|2402394827049882049
Who is the greatest Goddess in the world?
Sasha
Kristina
Sasha
Katya
Valeria
AuthorOfQuestion
Millionaire
459385734954395394
QUESTION|9845495845948594999
Where Sasha live?
Novgorod
St. Petersburg
Kazan
Novgorod
Chistopol
Another author
Millionaire
903034225025025568
QUESTION|ABC121980850540445C
Another question.
Katya
Sasha
Kazan
Chistopol
Katya
Unknown author

3. Comportamento esperado

Eu preciso ordenar alfabeticamente as linhas 6 a 9, depois classificar 16 a 19, 26 a 29 e assim por diante.

mas não classifique outras linhas.

Oresultadodevesereste:

Millionaire 123456788763237476 QUESTION|2402394827049882049 Who is the greatest Goddess of the world? Sasha Katya Kristina Sasha Valeria AuthorOfQuestion Millionaire 459385734954395394 QUESTION|9845495845948594999 Where Sasha live? Novgorod Chistopol Kazan Novgorod St. Petersburg Another author Millionaire 903034225025025568 QUESTION|ABC121980850540445C Another question. Katya Chistopol Katya Sasha Kazan Unknown author

4. Não ajudou

  1. pesquisando
  2. Eu acho que os comandos Unix sort , sed e awk podem resolver tarefas semelhantes, mas eu não acho, como eu posso resolver minha tarefa, usar esses comandos.
por Саша Черных 28.06.2017 / 13:07

2 respostas

3

Supondo que cada seção comece com o texto Millionaire , você poderá fazer isso com vim / ex - de forma interativa ou por script, por exemplo:

$ ex SashaMillionaire.md << 'EOF'
:g/^Millionaire$/+5,+8 sort
:1,$p
:q
EOF

Millionaire
123456788763237476
QUESTION|2402394827049882049
Who is the greatest Goddess in the world?
Саша
Валерия
Катя
Кристина
Саша
AuthorOfQuestion
Millionaire
459385734954395394
QUESTION|9845495845948594999
Where Sasha live?
Novgorod
Chistopol
Kazan
Novgorod
St. Petersburg
Another author
Millionaire
903034225025025568
QUESTION|ABC121980850540445C
Another question.
Katya
Chistopol
Katya
Kazan
Sasha
Unknown author

Para modificar o arquivo no local, substitua a instrução de impressão 1,$p por w

ex SashaMillionaire.md << 'EOF'
:g/^Millionaire$/+5,+8 sort
:wq
EOF

ou, se preferir um one-liner em vez de um heredoc,

printf ':g/^Millionaire$/+5,+8 sort\nwq\n' | ex SashaMillionaire.md
    
por 28.06.2017 / 14:20
1

Com awk , você pode fazer algo como:

awk '
  $0 == "Millionaire" {
    if (n < 0) {
      close("sort")
      print last
    }
    n = 4
  }
  n > 0 {
    n--
    print
    next
  }
  n-- {print last | "sort"}
  {last = $0}
  END {
    if (n < 0) {
      close("sort")
      print last
    }
  }'

Para classificar as linhas do quarto após Millionaire para o segundo antes do próximo Millionaire .

    
por 28.06.2017 / 23:26