インデントされた行を親行とグループ化しながら行を並べ替えます。

インデントされた行を親行とグループ化しながら行を並べ替えます。

ブックインデックスなどの行のリストがあります。

day
    satur-
    sun-
    holy-
night
    ball
    to-
eve
    election
    christmas

day今、私はこの行を明確な方法でソートしたいと思います。各「親」項目(、、、nighteveをそれぞれのインデントされた「子」項目(satur-、、、...)とグループ化し、親項目ごとにペアリングしたいと思います。sun-このグループはソートされます。 。また、特定のグループ内のサブアイテムをソートしたいと思います。

したがって、希望の出力は次のようになります。

day
    holy-
    satur-
    sun-
eve
    christmas
    election
night
    ball
    to-

このようなUnixコアツールを使用してこれを達成するための最良の方法は何ですかsort

答え1

テキストファイルに表示されない可能性のある文字を選択し、各子行に親名とその文字を追加し、ソートしてから、各子行から親名と区切り文字を削除することができます(たとえば、gnusedおよび低ASCII文字使用)。\x02

sed '/^[^[:blank:]]/h;//!G;s/\(.*\)\n\(.*\)/\2\x02\1/' infile | sort | sed 's/.*\x02//'

仕組み:
最初の作業はsed次のことを行います。
/^[^[:blank:]]/h- インデントされていない行(親行)を
//!G予約済みスペースにコピーします。 - 予約済みスペースの内容をインデントされた行(子行)のパターンスペースに追加します
s/\(.*\)\n\(.*\)/\2\x02\1/。パターン空間行を削除し、\newlineを置き換えてから、2行目まですべて削除します。\x02
sort\x02sed 's/.*\x02//'

関連情報