2011-10-18 4 views
1

Je souhaite extraire des lignes d'un fichier correspondant à un motif particulier et je souhaite le faire pour plus de 500 fichiers. Il devrait également pouvoir conserver le nom unique du fichier.Sélectionner les lignes en fonction du modèle de texte

J'ai utilisé awk mais ensuite je dois faire chaque fichier individuellement.

c:\>gawk "/S1901/" Census_Tract_*.csv > Census_Tract_*.csv 

Dans l'exemple illustré dans le lien ici (http://bit.ly/nMX8qh) Je veux conserver que les enregistrements qui ont S1901 en eux. Toutes mes excuses pour le lien externe mais je ne suis pas capable de conserver le formatage de la table.

J'ai trouvé du code perl que j'ai utilisé pour l'écrire mais il conserve toutes les lignes et ne sélectionne pas seulement les lignes/enregistrements où le motif correspond. Tous les conseils seraient très appréciés. Le code perl est ci-dessous:

#perl -w 
$pattern = "Subject_Census*.csv"; # process only those files that match pattern 
while (defined ($in = glob($pattern))) { 
    ($out = $in) =~ s/\.csv$/.outcsv/;   # read from "xyz.in" and write to "xyz.out" 
    open (IN, "<", $in) or die "Can't open $in for reading: $!"; 
    open (OUT,">>", $out) or die "Can't open $out for writing: $!"; 
    while (<IN>) { 
    $mystring =~ /S1901/; 
    print OUT $_ if $mystring == 0; 
    } 
    close (IN) or die "Can't close $in: $!"; # good idea to do some housekeeping 
    close (OUT) or die "Can't close $out: $!"; 
} 

Répondre

1

Untested:

use strict; 
use warnings; 
use autodie; 

my $files_list_filename = 'files.txt'; 

open my $fl, '<', $files_list_filename; 
my @list_of_files = <$fl>; 
chomp @list_of_files; 
close $fl; 

foreach my $file (@list_of_files) { 
    open my $test_fh, '<', $file; 
    while (my $line = <$test_fh>) { 
     if($line =~ m/S1901/) { 
      print "$file at $.: $line"; 
     } 
    } 
    close $test_fh; 
} 

Est-ce ce genre de ce que vous aviez en tête? Il ouvre un fichier nommé filelist.txt et lit dans une liste de nombreux noms de fichiers que vous voulez lui donner. Puis il itère sur cette liste, ouvrant chaque fichier un par un, analysant chaque fichier un par un, et si une ligne contenant le texte de déclenchement est trouvée, il imprime le nom de fichier et le numéro de ligne, ainsi que la ligne où le déclencheur était rencontré. Ensuite, il passe à la suivante.

+0

Merci DavidO. Ce code fonctionne pour moi. Appréciez l'aide. – Krishnan

+0

Vous êtes les bienvenus. Heureux que c'était sur la bonne voie. – DavidO

1
perl -ni.bak -e 'print if /S1901/' Subject_Census*.csv 
Questions connexes