파일의 특정 줄 정렬

파일의 특정 줄 정렬

1. 요약

모든 파일이 아닌 파일의 특정 위치에서 줄을 정렬하는 방법을 이해하지 못합니다.

이 작업을 어떤 무료 방법으로든 해결할 수 있다면 좋을 것 같습니다.


2. 설정

1. 파일 구조

대용량(19MB) 파일이 있고 SashaMillionaire.md다음과 같은 문제가 있습니다.경기. 반복되는 블록으로 구성됩니다. 각 블록에는 10개의 라인이 있습니다. 파일 구조(PCRE 정규식 사용)

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

SashaMillionaire.md10줄 블록 외에는 다른 줄과 텍스트가 없습니다. 빈 줄이 없으며 10줄 이상 또는 이하의 블록이 있습니다.

2. 파일 내용의 예

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. 예상되는 동작

6~9행을 알파벳순으로 정렬한 다음 16~19행, 26~29행 등을 정렬해야 합니다.

    하지만다른 행은 정렬되지 않습니다.

예

결과는 다음과 같아야 합니다.

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. 도움이 되지 않음

  1. 구글 검색
  2. 유사한 작업을 해결할 sort수 있는 Unix 명령을 찾았 지만 이러한 명령을 사용하여 작업을 해결하는 방법을 찾지 못했습니다.sedawk

답변1

각 섹션이 text 로 시작한다고 가정하면 다음과 같이 / - 대화형 또는 스크립트를 사용하여 이 작업을 Millionaire수행할 수 있습니다 .vimex

$ 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

파일을 제자리에서 수정하려면 print 문을 1,$p다음으로 바꾸세요.w

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

또는 heredoc 대신 한 줄을 선호한다면,

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

답변2

를 사용하면 awk다음을 수행할 수 있습니다.

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
    }
  }'

Millionaire다음 행 이전에 4행부터 2행까지 행을 정렬합니다 Millionaire.

관련 정보