使用键和配对元素Perl

时间:2013-08-01 12:10:10

标签: perl

我的数据如下:

    G1  G2  G3  G4
Pf1 NO  B1  NO  D1
Pf2 NO  NO  C1  D1
Pf3 A1  B1  NO  D1
Pf4 A1  NO  C1  D2
Pf5 A3  B2  C2  D3
Pf6 NO  B3  NO  D3

我的目的是检查每一列是否有一个元素(不同于“NO”个案例)两次显示(例如第2列中的A1),只有两次(如果它显示三次或更多我不要不希望它出现在输出中),如果是这样,写下第一列的对应元素。因此,所需的输出如下所示:

Pf3 Pf4 A1
Pf1 Pf3 B1
Pf2 Pf4 C1
Pf5 Pf6 D3

我正在尝试编写一个perl脚本,但我需要一些帮助来专注于不同的步骤。这就是我到目前为止所做的:

open (HAN, "< $file_in") || die "Impossible open the in_file";
@r = <HAN>;
close (HAN);
for ($i=0; $i<=$#r; $i++){
chomp ($r[$i]);
($Ids, @v) = split (/\t/, $r[$i]);
}
}

但我无法向任何方向前进! (我的perl知识需要你推动!)

我心中的热点是:

  • 如何比较同一列中的元素(或同一文件中的任何内容)?

  • 如何将第一列的元素与其他列的元素(可能是键)相关联?

任何帮助都是绝对必要的,欢迎!

2 个答案:

答案 0 :(得分:1)

Perl multi liner:),

perl -anE '
  /^\S/ or next;
  $k = shift @F; 
  push @{$t{$_}}, $k for@F;
  }{ 
  @$_-1==2 and say join" ",@$_ for map [@{$t{$_}},$_], sort keys%t;
' file

答案 1 :(得分:1)

use Data::Dumper;

my %hash;
while (<DATA>) {

    next if $.==1;
    chomp;
    my ($first,@others) = (split /\s+/);
    for (@others){
        $hash{$_}.=' '.$first;
    }
}

print Dumper \%hash;
__DATA__
    G1  G2  G3  G4
Pf1 NO  B1  NO  D1
Pf2 NO  NO  C1  D1
Pf3 A1  B1  NO  D1
Pf4 A1  NO  C1  D2
Pf5 A3  B2  C2  D3
Pf6 NO  B3  NO  D3

我在这里使用什么? (技巧)

while (<DATA>){BLOCK} - 从Perl脚本文件中的特定DATA部分读取数据。 (是的,如果你愿意的话,你可以在这里放置测试数据。但是不要存储所有内容!这不是垃圾箱!)

next if $.==1 - $. - 特殊变量,用于存储输入数据的行号。比如'index'。

chomp; - 返回while(<DATA>)。 Perl中的一些变量是隐藏的。在函数 - @_输入参数数组中。并且Perl程序员总是喜欢使用$_ - You变量。

这个while(<DATA>)实际上是一个隐藏的while(defined($_ = <DATA>))

函数chomp使用hidden-You变量并尝试在最后剪切\ n符号。

函数split /REGEX/也作为默认变量hidden-You变量($_)。