#!/usr/bin/perl
my $file = $ARGV[0];
my $value = $ARGV[1];
my @grabbed;
open (FILE, $file);
while (<FILE>) {
if (/alignment# residue#/) {
push @grabbed, $_;
while (<FILE>) {
last if /^$/;
push @grabbed, $_;
}
}
}
close (FILE);
my $line= `awk ' {if(\$2==$value)} ' @grabbed`;
print $line;
问题:
1.首先,我不知道是否可以在数组上执行awk? 2.我试图匹配存在于二维数组的第二列(@grabbed)上的值。 @grabbed将如下所示:
7 1 M 1.000 6 .VPMLG 66.63
8 2 S 1.000 10 .QINTSARKG 66.63
9 3 V 1.000 13 .KTAVFPRGQMSL 66.63
10 4 L 1.000 7 .SLAKFT 66.63
11 5 L 1.000 14 .ALSVQWIKMRYPF 66.63
12 6 R 1.000 16 .DERSAVGTNQLYMIP 66.63
13 7 S 1.000 18 .GDTHPKRSALFCIQVYN 66.63
14 8 G 1.000 17 .DRFLENGAQPSTYCHM 66.63
15 9 L 1.000 19 .NDHPELASVKRCWFGTQI 66.63
16 10 G 1.000 18 .RLDPEGFTYAVCIKNMH 66.63
我正在尝试匹配并抓住第2列值为“9”的行。
答案 0 :(得分:4)
当awk
也能完成这项工作时,无需切换到perl
。
for ( @grabbed ) {
my @f = split;
if ( $f[1] == $value ) {
push @line, $_;
}
}
答案 1 :(得分:3)
看来,“2D数组”是指一个字符串数组,每个字符串都是以空格分隔的值列表。
Perl是为这种事情而制作的。您可以使用另一个答案的建议,即拆分每一行并查看每个值;但是,简单的正则表达式会更快。用以下内容替换你的awk行:
foreach (@grabbed)
{
#Match the beginning of the line, possibly some whitespace,
#then some digits, then more whitespace, then the contents of $value
if (/^\s*\d+\s+$value/)
{
#The line matched: do stuff
}
}
此外,您是否需要查看不匹配的行?如果没有,将整个文件放入数组会更有效率;相反,只需在while
循环中执行所有处理。