本の索引のような行のリストがあります。
day
satur-
sun-
holy-
night
ball
to-
eve
election
christmas
ここで、これらの行を明白な方法で並べ替えたいと思います。つまり、すべての「親」エントリ ( day
、、) を、それぞれインデントされた「子」エントリ ( 、、 …) とグループ化し、これらのグループを親エントリで並べ替えたいと思います。またnight
、任意のグループ内の子エントリも並べ替えたいと思います。eve
satur-
sun-
したがって、望ましい出力は次のようになります。
day
holy-
satur-
sun-
eve
christmas
election
night
ball
to-
のような Unix コア ツールを使用してこれを最も効果的に実現するにはどうすればよいでしょうかsort
?
答え1
テキストファイルで出現する可能性が低い文字を選択し、親の名前とその文字を各子の行の先頭に追加し、並べ替えてから、各子の行から親の名前と区切り文字を削除します。gnu
たとえば、sedとlow ASCII文字を使用します。\x02
sed '/^[^[:blank:]]/h;//!G;s/\(.*\)\n\(.*\)/\2\x02\1/' infile | sort | sed 's/.*\x02//'
動作方法:
1番目はsed
以下を実行します:
/^[^[:blank:]]/h
- インデントされていない行 (親) をホールドスペースにコピーします
//!G
- インデントされた行 (子) では、ホールドスペースの内容をパターンスペースに追加します
s/\(.*\)\n\(.*\)/\2\x02\1/
- パターンスペースの行を交換し、\n
新しい行を\x02
それ以降の行に置き換え、2番目sort
までのすべてを削除します\x02
sed 's/.*\x02//'