我有一个由多个部分组成的文件,每个部分都以特定标题开头,但所有部分都以相同的字符串结尾,我想根据标题对文件部分进行排序,而不对每个部分的内容进行排序(即将整个部分作为一个部分)块)每两个部分之间还有一个空行,以澄清输入是否为的想法
string5
z
y
x
string
string2
x
z
y
f
string
所需的输出将是
string2
x
z
y
f
string
string5
z
y
x
string
答案1
使用 GNUsed
和sort
:
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