gpt4 book ai didi

regex - 在一个文件中查找具有相同列对的行

转载 作者:行者123 更新时间:2023-11-29 09:46:53 24 4
gpt4 key购买 nike

假设我有这个制表符分隔的文件

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 会更好,但我的一个 friend 建议使用 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

关于regex - 在一个文件中查找具有相同列对的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34930181/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com