ブックインデックスなどの行のリストがあります。
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および低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/
。パターン空間行を削除し、\n
ewlineを置き換えてから、2行目まですべて削除します。\x02
sort
\x02
sed 's/.*\x02//'