假设我有这个制表符分隔的文件
id1 term1 term2
id2 term1 term2
id3 tern2 term3
我想做的是计算相同的column2 column3出现次数以及它们所引用的ID。
因此,新的制表符分隔文件将如下所示:
term1 term2 2 id1,id2
term2 term3 1 id3
我已经尝试过这种单线,这是我最接近所需解决方案的一种
awk '{count[$2,$3]++;} END {for (word in count) printf("%s\t%s\n", word,count[word])}'
但是我得到的是:
term1 term2 2
term2 term3 1
在术语之间是一个矩形。
任何与Perl或awk或其他任何方式有关的想法都会很可爱。
起初我以为Perl会更好,但我的一个朋友建议awk。这是我第一次接触awk。
该解决方案按您的要求进行
数组的@pairs
唯一目的是保留输入数据的顺序。如果不需要,则可以大大减少代码
我假设给定的第2列/第3列对值可能在具有相同ID的情况下出现多次。这意味着我必须与累加相关ID分开计算该对的出现次数。如果不正确,那么计数就是每对ID的数量
use strict;
use warnings;
use feature 'say';
my %pairs;
my @pairs;
while ( <> ) {
chomp;
my ($id, $pair) = split "\t", $_, 2;
push @pairs, $pair unless $pairs{$pair};
++$pairs{$pair}{count};
$pairs{$pair}{ids}{$id} = 1;
}
for my $pair ( @pairs ) {
my ($n, $ids) = @{ $pairs{$pair} }{qw/ count ids /};
say join "\t", $pair, $n, join(',', keys %$ids);
}
term1 term2 2 id1,id2
tern2 term3 1 id3
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句