我有一个类似书籍索引的行列表,比如说
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 ,然后删除一切直到并包括第二个\x02
sort
\x02
sed 's/.*\x02//'