/ / Abgleich eines Wertes in einem 2D-Array - Perl, awk, Abgleich

Matching einen Wert in 2D-Array - Perl, Awk, Matching

#!/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 № 1

Es 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.