首页 > 解决方案 > 在 Linux shell 中对文本块进行排序?

问题描述

使用 bash 和通常可用的 unix 命令,我如何对文件中的文本“块”进行排序,其中“块”是一组由空行分隔的行?

例如,这两个项目将被颠倒。

item b:
    b stuff

item a:
    a stuff

标签: linuxbashshell

解决方案


使用 GNU 工具,您可以对以 NUL ASCII 字符(而不是换行符)结尾的文本块进行排序。

下面的想法是在每个块之后添加 NUL 字符(带gawk),对结果进行排序(带sort -z),然后删除该 NUL 字符(带tr):

gawk -v RS= -v ORS='\n\n\0' 1 input_file.txt \
| sort -z \
| tr -d '\0'

注意:这可能会在文件末尾添加一个空行;您可以使用... | sed '$ d'(或... | head -n -1使用 GNU 头)删除它。


推荐阅读