Bash 文本的排序部分(unix/shell)

Bash 文本的排序部分(unix/shell),bash,unix,sorting,Bash,Unix,Sorting,我有一些数据集(foo),其中bar和baz作为部分输出。带有baz的部分应排序在输出的顶部 示例输入 = foo4 = bar (..) barN = foo1 = bar (..) barN = foo5 = bar (..) barN baz = foo2 = bar (..) barN = foo3 = bar (..) barN baz 在上面的示例中,我希望将节=foo3=和=foo5=移动到输出的顶部,并按节“name”对列表进行子排序,即 但保持本节内容完整。Perl解决方案。

我有一些数据集(
foo
),其中
bar
baz
作为部分输出。带有
baz
的部分应排序在输出的顶部

示例输入

= foo4 =
bar
(..)
barN
= foo1 =
bar
(..)
barN
= foo5 =
bar
(..)
barN
baz
= foo2 =
bar
(..)
barN
= foo3 =
bar
(..)
barN
baz
在上面的示例中,我希望将节
=foo3=
=foo5=
移动到输出的顶部,并按节“name”对列表进行子排序,即


但保持本节内容完整。

Perl解决方案。它使用节的散列,键是节的名称,值包含节在文件中开始的位置以及是否存在
baz
的信息。一旦文件被读取到散列中,就会对键进行排序并打印内容,并按记忆在文件中移动

#/usr/bin/perl
使用警告;
严格使用;
我的$file=shift;
我的$start=qr/^=(.*)=$/;

打开我的$FH,“Lottastuff解决方案,又称胖oneliner:


最初的转变实在太挑剔了。应该有一些工具能够粘贴行,直到分隔符(:

完全按照广告中的方式工作,是一个快速易读的答案。我会并且将再次阅读a++。顺便说一句,我还有“死”一词/空节-我可以用另一个
elsif
丢弃那些吗?@Jan:好吧,空节将通过第一个
if
分支。一旦包含任何内容,你可以将节设置为非空,即在检查
/baz/
之前。你可以在输出时跳过寻找空节。我考虑过类似的方法,b但最后看起来太糟糕了。不过,谢谢你抽出时间来建议:)
= foo3 =
= foo5 =
= foo1 =
= foo2 =
= foo4 =
awk '/^=/{print ""} {printf "%s\t", $0}' input.txt | \
    awk '{print ($NF != "baz")"\t"$0}' | sort -n | cut -f 2- | \
    tr '\t' '\n' | sed -e '/^$/d'