使用Awk或Perl删除唯一和反向对

时间:2014-04-21 14:00:54

标签: perl awk

下面是我的示例文件(第1列和第2列用标签分隔)

P49418"\t"O43426
P49418"\t"O43426
O43426"\t"P49418
......

对于上面给出的三对,我只需要一名代表。

P49418"\t"O43426

需要对文件的其余部分执行类似的操作。如何使用awk或Perl执行?

2 个答案:

答案 0 :(得分:3)

在完成读取输入数据之后,您可以使用哈希表来记录您目前看来的项目,只输出该哈希表的键。

如果您想保留项目的顺序,则需要额外的列表来累积结果。

试试这个:

#!/usr/bin/perl

use strict;
use warnings;

my %record;

while (<DATA>) {
    chomp;
    my @field = split;
    $record{join "  ", sort { $b cmp $a } @field} = 1;
}

foreach my $r (keys %record) {
    print "$r\n";
}

__DATA__
P49418  O43426
P49418  O43426
O43426  P49418

答案 1 :(得分:1)

awk应该有效:

awk -F'\t' '!a[$1,$2]++ && !a[$2,$1]++' file

使用两个字段作为数组的键并检查重复项。

$ cat file
P49418  O43426
P49418  O43426
O43426  P49418
$ awk -F'\t' '!a[$1,$2]++ && !a[$2,$1]++' file
P49418  O43426