一、总结
我不明白,如何在文件的某些位置而不是在所有文件中对行进行排序。
如果可以通过任何免费方法解决此任务,那就太好了。
2. 设置
1. 文件结构
我有一个大(19 MB)文件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.没有帮助
- 谷歌搜索
- 我发现 Unix 命令
sort
可以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
到下一行之前的第二行排序Millionaire
。