首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文本排序部分(unix/shell)

文本排序部分(unix/shell)
EN

Stack Overflow用户
提问于 2013-07-29 12:00:47
回答 2查看 448关注 0票数 2

我有一些数据集(foo),以barbaz作为部分的输出。应该将带有baz的部分排序为输出的顶部。

示例输入;

代码语言:javascript
复制
= foo4 =
bar
(..)
barN
= foo1 =
bar
(..)
barN
= foo5 =
bar
(..)
barN
baz
= foo2 =
bar
(..)
barN
= foo3 =
bar
(..)
barN
baz

在上面的示例中,我希望将节= foo3 == foo5 =移到输出的顶部,并按“名称”部分对列表进行子排序。

代码语言:javascript
复制
= foo3 =
= foo5 =
= foo1 =
= foo2 =
= foo4 =

但这部分的内容完好无损。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-29 12:24:30

Perl解决方案它使用节的散列,键是节的名称,值包含节开始所在的文件中的位置以及是否存在baz的信息。一旦文件被读入哈希,键就会被排序,内容就会被打印出来,就像记忆中的那样在文件周围移动。

代码语言:javascript
复制
#!/usr/bin/perl
use warnings;
use strict;

my $file = shift;

my $start = qr/^= (.*) =$/;

open my $FH, '<', $file or die $!;

my %sections;
my $current_section;
while (<$FH>) {
    if (/$start/) {
        $current_section = $1;
        $sections{$current_section}{begin} = tell $FH;
    } elsif (/baz/) {
        $sections{$current_section}{baz} = 1;
    }
}

for my $section (map substr( $_, 1),
                 sort map { ($sections{$_}{baz} ? '0' : '1') . $_ }
                 keys %sections) {
    seek $FH, $sections{$section}{begin}, 0;
    print "= $section =\n";
    while (<$FH>) {
        last if /$start/;
        print;
    }
}
票数 1
EN

Stack Overflow用户

发布于 2013-07-29 23:48:21

洛塔斯塔夫溶液,a.,脂肪

代码语言:javascript
复制
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'

最初的转变太挑剔了。应该有一些工具可以粘贴线条,直到分隔符(:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17923470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档