2016-03-29 5 views
0

Ich habe eine CSV-Datei, in der ich nach einem bestimmten Wort suchen 'ELEKTRIKER' suchen, die der erste Eintrag in der Spalte ist. Ich möchte die gesamte Spalte mit dem Namen ELECTRICIANS ausdrucken und wenn ich ein anderes Wort grep, sollte einen Fehler ausgeben. wie folgtVerwenden Sie grep Befehl, um ein Wort zu finden und dann die gesamte Spalte in Perl-Skript

Ich habe grep Operation ausgeführt:

my $exit = system("grep -q $column_name $file_name"); 
if ($exit == 0) 
{ 
     print "Entered column name $column_name found in file $file_name\n"; 
} 
else { 
     print "Column name not found, try again!\n"; 
     exit; 
} 

Nun, wie drucke ich die Spalte in der Datei unter ‚ELECTRICIANS‘?

Inhalt der CSV-Datei ist wie folgt:

WEEK,SITE ENGINEERS,SITE ENGINEERS 2,ELECTRICIANS,ELECTRICIANS 2 
ONE,13,28,17,29 
TWO,13,30,18,27 
THREE,13,30,14,23 
FOUR,15,30,12,29 
FIVE,15,22,16,24 
SIX,16,30,20,30 
SEVEN,12,27,13,29 
EIGHT,19,22,16,29 
NINE,19,21,19,30 
TEN,12,22,14,30,13 
+0

In Ihrem Ansatz, würden Sie das Ergebnis Ihrer grep Befehl in einem Perl-Variablen speichern müssen. Dies bedeutet, dass Sie nicht 'system (" grep ... ")', sondern etwas wie 'qx (grep ....)' verwenden können. Aber warum erstellen Sie einen Childprocess nur zum Überlappen der Linie? Sie könnten dies ganz einfach innerhalb von Perl tun. – user1934428

+0

Mir ist die qx-Syntax nicht bekannt. Wie speichere ich die Ausgabe des Befehls grep in eine Variable? –

+0

'my $ output = qx (...)'. Siehe die Manpage [perlop] (http://perldoc.perl.org/perlop.html#Quote-Like-Operators). – user1934428

Antwort

0

Sie sind ein Perl-Skript zu schreiben, gibt es keine Notwendigkeit, ein Kind-Prozess zum Laichen in die Schale, um dann eine andere Shell-Funktion aufrufen. Perl hat grep eingebaut. Unten sehen Sie als Beispiel, wie Sie in Perl das gleiche Ergebnis erzielen können. Ich habe auch Kommentare hinzugefügt, um das Skript zu erklären.

use strict; 
use warnings; 

#set the column name, this could be changed to accept input from user, 
#also read from the data file handle, this could also be changed to read from any other file 
my $column = "ELECTRICIANS"; 
my @headers = split(',',<DATA>); 

#Check for the column name rom the headers just read from the file handle, if not found then exit 
unless (grep {$_ eq "$column"} @headers){ 
    print "Column name $column not found, try again!\n"; 
    exit 1; 
} 

print $column, "\n"; 

#if we got to hear then the CSV file must have the column we are insterested in so start looping though the lines 
#split each line into fields then for each lin make a hash using the headers and the fields. then we can print the column 
#we are interested in 
while(<DATA>){ 
    chomp(); 
    my @fields = split(','); 
    my %data; 
    @data{@headers}[email protected]; 
    print $data{$column}, "\n"; 
} 

__DATA__ 
WEEK,SITE ENGINEERS,SITE ENGINEERS 2,ELECTRICIANS,ELECTRICIANS 2 
ONE,13,28,17,29 
TWO,13,30,18,27 
THREE,13,30,14,23 
FOUR,15,30,12,29 
FIVE,15,22,16,24 
SIX,16,30,20,30 
SEVEN,12,27,13,29 
EIGHT,19,22,16,29 
NINE,19,21,19,30 
TEN,12,22,14,30,13 

Diese Der Ausgang

ELECTRICIANS 
17 
18 
14 
12 
16 
20 
13 
16 
19 
14 

produziert Da jede Zeile gelesen wird und in einen Hash setzen, könnten Sie auch andere Spalten drucken, wie Sie den Spalten Namen für jedes Feld kennen.

1

Die letzte Zeile Ihrer Beispieldaten scheint eine zusätzliche Spalte zu haben.

Aber das macht was Sie wollen.

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

# read header 
my @cols = split /,/, <DATA>; 

# Process the rest of the data 
while (<DATA>) { 
    my %data; 
    @data{@cols} = split /,/; 
    say $data{ELECTRICIANS}; 
} 

__DATA__ 
WEEK,SITE ENGINEERS,SITE ENGINEERS 2,ELECTRICIANS,ELECTRICIANS 2 
ONE,13,28,17,29 
TWO,13,30,18,27 
THREE,13,30,14,23 
FOUR,15,30,12,29 
FIVE,15,22,16,24 
SIX,16,30,20,30 
SEVEN,12,27,13,29 
EIGHT,19,22,16,29 
NINE,19,21,19,30 
TEN,12,22,14,30,13 
0

ich oft für meine Einzeiler kritisiert, aber hier ist eine:

perl -F, -slane ' 
    if ($. == 1) { 
     for ($i=0; $i<@F; $i++) { 
      if ($F[$i] eq $colname) { 
       $colno = $i; 
       last; 
      } 
     } 
     die "cannot find $colname column" unless defined $colno; 
    } 
    print $F[$colno] 
' -- -colname=ELECTRICIANS file.csv 
Verwandte Themen