对行进行分组并将它们连接成perl中的一行

时间:2016-10-10 22:05:13

标签: perl concatenation

这似乎是一件基本的事情,但我无法想出一个简单的方法,无需开始构建大量的数组等。所以我很抱歉,如果这太简单了。

我有一个这种格式的文件:

a,x1
a,x2
a,x3
b,x4
c,x5
c,x6

这是一张非常大的图表的边缘列表。 我需要将其转换为以下格式:

a,x1 x2 x3
b,x4
c,x5 x6

(这是图的另一种常见格式)

在perl中有一种简单的方法吗?你可以假设所有的“a”和“b”都是排序的,所以一旦你到达一个新的起始节点(比如说“b”)就不会再回头了(例如没有更多的边缘从“a”传出)

任何建议都将受到赞赏。

2 个答案:

答案 0 :(得分:1)

将最后一个“from”节点保留在循环迭代中幸存的变量中。

"\n" x (1 != $.)

perl -aF, -ne 'chomp $F[1]; print "\n" x (1 != $.), "$F[0]," if $l ne $F[0]; print " " x ($l eq $F[0]), $F[1]; $l = $F[0] }{ print "\n"' < input 阻止在第一行之前打印换行符。

与单行相同:

{{1}}

答案 1 :(得分:0)

我分两个阶段完成。一个用于将数据转换为有用的数据结构,另一个用于打印数据。

我选择的数据结构是数组的哈希值。哈希的键是'a','b'和'c',值是对包含'x1,'x2'等的数组的引用。

代码如下所示:

#!/usr/bin/perl

use strict;
use warnings;
# We use modern Perl (specifically say())`
use 5.010;

my %edges;

while (<DATA>) {
  chomp;
  my ($key, $val) = split /,/;
  push @{$edges{$key}}, $val;
}

for (sort keys %edges) {
  say join ',', $_, @{$edges{$_}};
}

__DATA__
a,x1
a,x2
a,x3
b,x4
c,x5
c,x6