假设我有一个输入文件,其中每一行都包含从根 (A) 到叶子的路径
echo "A\tB\tC\nA\tB\tD\nA\tE" > lines.txt
A B C
A B D
A E
如何轻松生成结果树?:(A(B(C,D),E))
我喜欢使用 GNU 工具(awk、sed 等),因为它们更适合处理大文件,但 R 脚本也可以。 R 输入将是:
# lines <- lapply(readLines("lines.txt"), strsplit, " +")
lines <- list(list(c("A", "B", "C")), list(c("A", "B", "D")), list(c("A","E")))
最佳答案
在 Perl 中:
#!/usr/bin/env perl
use strict;
my $t = {};
while (<>) {
my @a = split;
my $t1 = $t;
while (my $a = shift @a) {
$t1->{$a} = {} if not exists $t1->{$a};
$t1 = $t1->{$a};
}
}
print &p($t)."\n";
sub p {
my ($t) = @_;
return
unless keys %$t;
return '('
. join(',', map { $_ . p($t->{$_}) } sort keys %$t)
. ')';
}
此脚本返回:
% cat <<EOF | perl l.pl
A B C
A B D
A E
EOF
(A(B(C,D),E))
请注意,由于 p 中的递归,此脚本根本不适合大型数据集。但这可以通过将其转换为双 for 循环来轻松解决,就像上面的第一个 while 一样。
关于r - 如何通过组合各个叶子路径来计算树的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20294078/