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. 役に立たない
- Google検索
- 同様のタスクを解決できる
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の代わりに1行を好むなら、
printf ':g/^Millionaire$/+5,+8 sort\nwq\n' | ex SashaMillionaire.md