对行进行排序,同时将缩进行与其父行分组

对行进行排序,同时将缩进行与其父行分组

我有一个类似书籍索引的行列表,比如说

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

您可以选择一个不太可能出现在文本文件中的字符,将父名称 + 该字符添加到每个子行,排序然后从每个子行中删除父名称和分隔符,例如使用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 ,然后删除一切直到并包括第二个\x02
sort\x02sed 's/.*\x02//'

相关内容