我的数据如下:
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知识需要你推动!)
我心中的热点是:
如何比较同一列中的元素(或同一文件中的任何内容)?
如何将第一列的元素与其他列的元素(可能是键)相关联?
任何帮助都是绝对必要的,欢迎!
答案 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
变量($_
)。