Text-Processing

對文件中的某些行進行排序

  • June 28, 2017

一、總結

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

如果有可能以任何免費方法解決此任務,那就太好了。


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

  1. 預期行為

我需要按字母順序對第 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. Google搜尋
  2. 我發現,Unix 命令sortsed並且awk可以解決類似的任務,但我沒有發現,如何使用這些命令來解決我的任務。

假設每個部分都以 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

引用自:https://unix.stackexchange.com/questions/373891