1

我的数据如下所示:

    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

我的目的是检查每一列是否显示了两次元素(不同于“否”情况)(例如第 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知识需要你推!)

我心中的热点是:

  • 如何比较来自同一列(或无论如何在同一文件中)的元素?

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

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

4

2 回答 2

1

Perl 多线 :),

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
于 2013-08-01T12:44:11.067 回答
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- $.- 特殊变量,存储输入数据的行号。像“索引”。

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

而这while(<DATA>)还真有隐情while(defined($_ = <DATA>))

函数chomp使用hidden-You变量并尝试在末尾砍掉 \n 符号。

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

于 2013-08-01T12:45:06.350 回答