1. 요약
모든 파일이 아닌 파일의 특정 위치에서 줄을 정렬하는 방법을 이해하지 못합니다.
이 작업을 어떤 무료 방법으로든 해결할 수 있다면 좋을 것 같습니다.
2. 설정
1. 파일 구조
대용량(19MB) 파일이 있고 SashaMillionaire.md
다음과 같은 문제가 있습니다.경기. 반복되는 블록으로 구성됩니다. 각 블록에는 10개의 라인이 있습니다. 파일 구조(PCRE 정규식 사용)
Millionaire
\d{18}
QUESTION.*
.*
.*
.*
.*
.*
.*
.*
Millionaire
\d{18}
QUESTION.*
.*
.*
.*
.*
.*
.*
.*
SashaMillionaire.md
10줄 블록 외에는 다른 줄과 텍스트가 없습니다. 빈 줄이 없으며 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. 도움이 되지 않음
- 구글 검색
- 유사한 작업을 해결할
sort
수 있는 Unix 명령을 찾았 지만 이러한 명령을 사용하여 작업을 해결하는 방법을 찾지 못했습니다.sed
awk
답변1
각 섹션이 text 로 시작한다고 가정하면 다음과 같이 / - 대화형 또는 스크립트를 사용하여 이 작업을 Millionaire
수행할 수 있습니다 .vim
ex
$ 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
.