2016-09-09 10 views
0

Gegeben eine matrixartige Textdatei, ich möchte alle Zeilen extrahieren (\t ist das Trennzeichen), die Werte> 60 in der 3. Spalte (Pos 2) und Werte> 80 enthalten in der 6. (pos 5) und senden Sie die Ausgabe an eine andere Datei.Soweit ich bekam:Perl: Extrahieren bestimmter Werte aus Matrix-Datei

#!/usr/bin/perl; 
use strict; 
use warnings; 
use diagnostics; 

open(my $in, "file.txt")or die $!; 
my $line = <$in>; 
my $count; 
while (<$in>) { 
    chomp; 
    my @element = split (/\t/,$_); 
    if ($element[2] >= 60 && $element[5] > 80){ 
     $count++; 
    } 
} 
close $in; 
print $count; 

Was ist los? Danke.PS. Ich habe ähnliche Fragen gefunden, aber meine schwachen Perl-Fähigkeiten haben mich daran gehindert, Entschlossenheit zu finden.

+0

Statt Inkrementieren $ count ist, könnten Sie tun, nur einen Druck "_ $ \ n"; um die Zeile auf dem Bildschirm auszudrucken. Auf diese Weise können Sie überprüfen, ob Sie in Ihrer if-Anweisung die richtigen Zeilen erhalten. Wenn es Probleme bei der Aufteilung gibt, bei der Sie nicht mehrere Elemente erhalten, müssen Sie möglicherweise den umgekehrten Schrägstrich mit einem weiteren umgekehrten Schrägstrich umgehen. – Glenn

Antwort

0
  1. Sie haben vergessen, den Lesemodus (<) in open hinzuzufügen.
  2. Stellen Sie sicher, dass die Zeilen in Ihrer Datei wirklich tabulatorgetrennt sind.

Unten funktioniert gut für mich.

#!/usr/bin/perl 
use strict; 
use warnings; 

open(my $in, "<", "file.txt") or die $!; 

my $count; 

while (<$in>) { 
    chomp; 
    my @element = split (/\t/,$_); 
    if ($element[2] >= 60 && $element[5] > 80){ 
     $count++; 
    } 
} 

close $in; 
print $count; 

Wo datei.txt

10 20 60 40 50 90 70 80 
10 20 20 40 50 30 70 80 
10 20 40 40 50 50 70 80 
10 20 65 40 50 80 70 80 
10 20 70 40 50 90 70 80 
10 20 50 40 50 90 70 80 

das heißt ersten und fünften Zeilen der Datei die if Bedingung erfüllt.

0

Ich habe Kopieren Sie den Code eingefügt, wie Sie es gerade geschrieben haben und ich enev den Inhalt der Textdatei ersetzt, aber noch erhalte ich die folgende Fehlermeldung:

Use of uninitialized value $element[2] in numeric ge (>=) at C:\Perl64\Temp1\ex.pl line 12, <$in> line 1. 
Use of uninitialized value $element[2] in numeric ge (>=) at C:\Perl64\Temp1\ex.pl line 12, <$in> line 2. 
Use of uninitialized value $element[2] in numeric ge (>=) at C:\Perl64\Temp1\ex.pl line 12, <$in> line 3. 
Use of uninitialized value $element[2] in numeric ge (>=) at C:\Perl64\Temp1\ex.pl line 12, <$in> line 4. 
Use of uninitialized value $element[2] in numeric ge (>=) at C:\Perl64\Temp1\ex.pl line 12, <$in> line 5. 
Use of uninitialized value $element[2] in numeric ge (>=) at C:\Perl64\Temp1\ex.pl line 12, <$in> line 6. 
Use of uninitialized value $count in print at C:\Perl64\Temp1\ex.pl line 18. 

Alle auf das dauern?

+0

Dann denke ich Zeilen in Datei sind nicht wirklich Tab getrennt. –

0

ich die Datei neu erstellt, Tab getrennt und gibt nach wie vor:

Use of uninitialized value $count in print at C:\Perl64\Temp1\ex.pl line 19. 

die Linie 19 print $count;

+0

Das bedeutet, dass der $ count nicht erhöht wurde. Das bedeutet, dass die if-Bedingung nicht erfolgreich war. Das könnte der Fall sein, wenn die 3. und 6. Spalte keine Werte größer als 60 bzw. 80 haben. Sehen Sie diese Demo funktioniert korrekt: http://ideone.com/evjXgj –

+0

Bitte auch nicht hinzufügen/löschen Antworten. Sie können stattdessen Ihre Frage bearbeiten, um weitere Daten hinzuzufügen. –

+0

Tatsächlich war in der wiederhergestellten Datei nur eine Bedingung wahr. Vielen Dank. – Megiddo

Verwandte Themen