#!/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.Erstens weiß ich nicht, ob es möglich ist, awk auf einem Array auszuführen oder nicht? 2. Ich versuche einen Wert zu finden, der in der zweiten Spalte des 2-D-Arrays (@grabbed) vorhanden ist. Das @grabbed sieht dann so aus:
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
Ich versuche, die Zeile zu finden, in der Spalte 2 den Wert "9" hat.
Antworten:
4 für die Antwort № 1Es ist nicht nötig, zu wechseln awk
wenn diese Arbeit erledigt werden kann perl
auch.
for ( @grabbed ) {
my @f = split;
if ( $f[1] == $value ) {
push @line, $_;
}
}
3 für die Antwort № 2
Anscheinend meinen Sie mit "2D Array" ein Array von Strings, wobei jeder String eine durch Leerzeichen getrennte Liste von Werten ist.
Perl ist für so etwas gemacht. Sie können den Vorschlag der anderen Antwort verwenden, jede Zeile zu teilen und jeden Wert zu betrachten. Ein einfacher regulärer Ausdruck wäre jedoch schneller.
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
}
}
Müssen Sie sich auch die Zeilen ansehen, die nicht übereinstimmen? Wenn nicht, wäre es viel effizienter, die gesamte Datei nicht in ein Array zu legen, sondern erledigen Sie einfach die gesamte Verarbeitung in while
Schleife.