#!/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;
Problem:
1. Po pierwsze, nie wiem, czy możliwe jest wykonanie awk na tablicy, czy nie? 2. Próbuję dopasować wartość istniejącą w drugiej kolumnie tablicy 2-D (@grabbed). @Grabbed będzie wyglądać tak:
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
Próbuję dopasować i pobrać linię, w której kolumna 2 ma wartość „9”.
Odpowiedzi:
4 dla odpowiedzi № 1Nie trzeba się do niego przekonywać awk
kiedy można wykonać tę pracę perl
także.
for ( @grabbed ) {
my @f = split;
if ( $f[1] == $value ) {
push @line, $_;
}
}
3 dla odpowiedzi № 2
Wydaje się, że przez „2D Array” masz na myśli tablicę ciągów, z których każdy jest rozdzieloną białymi listami wartości.
Perl jest stworzony do tego rodzaju rzeczy. Możesz użyć innej sugestii odpowiedzi, aby podzielić każdą linię i spojrzeć na każdą wartość; jednak proste wyrażenie regularne byłoby szybsze.
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
}
}
Czy kiedykolwiek będziesz musiał przyjrzeć się wierszom, które nie pasują? Jeśli nie, znacznie bardziej efektywnie byłoby nie umieszczać całego pliku w tablicy, zamiast tego po prostu wykonaj wszystkie operacje w while
pętla.