如何按字母顺序对文件各部分进行排序?

如何按字母顺序对文件各部分进行排序?

我有一个由多个部分组成的文件,每个部分都以特定标题开头,但所有部分都以相同的字符串结尾,我想根据标题对文件部分进行排序,而不对每个部分的内容进行排序(即将整个部分作为一个部分)块)每两个部分之间还有一个空行,以澄清输入是否为的想法

string5
z
y
x
string

string2
x
z
y
f
string

所需的输出将是

string2
x
z
y
f
string

string5
z
y
x
string

答案1

使用 GNUsedsort

sed 's/^$/\x0/g' file | sort -z | tr '\0' '\n'
  • 将空字符放入空行
  • sort使用空字符作为分隔符 ( -z)
  • 最后使用 替换空分隔符为新行tr
  • 要删除输出第一行和最后一行中的空行,您可以添加| sed '1{/^$/d};${/^$/d}'

输出:

string2
x
z
y
f
string

string5
z
y
x
string

(也许有人可以帮助\x0为非 GNU 工作sed相关问题

答案2

在段落模式下使用 GNUawk并以字符串模式对数组的值进行排序,然后打印:

awk -v RS= '{ seen[NR]=$0 }
END { PROCINFO["sorted_in"]="@val_str_asc";
      for (block in seen) {print sep seen[block]; sep=ORS}
}' infile

答案3

perl

perl -l -00 -e '
  chomp(@paragraphs = <>);
  print join "\n\n", sort @paragraphs' your-file

相关内容