这似乎是一件基本的事情,但我无法想出一个简单的方法,无需开始构建大量的数组等。所以我很抱歉,如果这太简单了。
我有一个这种格式的文件:
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”传出)
任何建议都将受到赞赏。
答案 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