对文件中的某些行进行排序

对文件中的某些行进行排序

一、总结

我不明白,如何在文件的某些位置而不是在所有文件中对行进行排序。

如果可以通过任何免费方法解决此任务,那就太好了。


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.没有帮助

  1. 谷歌搜索
  2. 我发现 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,$pw

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

相关内容