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

标签 regex bash perl awk

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

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/

相关文章:

linux - 使用包含 * 的路径存储在变量中

linux - 如何记录 bash 脚本中启动的作业的 pid

linux - 条件 Awk HashMap 匹配查找

windows - Perl Net::SFTP::Foreign Plink 连接问题

c# - 基于严格要求的正则表达式拆分和提取

regex - 是否有典型的移动用户代理正则表达式模式?

javascript - 正则表达式匹配所有不在结束标记之前的新行

mysql - 尝试检查 bash 脚本中是否存在 Mysql 用户

perl - Perl 的反引号、system 和 exec 有什么区别?

javascript - 什么正则表达式将匹配从指定的 "trigger"到空格?