2011-08-31 6 views
0

Je suis nouveau à Perl et j'essaie de l'apprendre. J'ai deux fichiers, 'file1' et 'file2', je dois trouver les symboles 'file1' ne sont pas en 'fichier2' pour companyA et départements B et C.Trouver des symboles dans des fichiers en utilisant Perl

Fichier1

GTY 
TTY 
UJK 
TRE 

Fichier2

departmentA_companyA.try=675 UJK 88 KKR 
departmentA_companyB.try=878 UJK 37 TAR 
departmentA_companyC.try=764 UJK 92 PAM 
departmentB_companyA.try=675 UJK 88 KKR 
departmentB_companyB.try=878 UJK 37 TAR 
departmentB_companyC.try=764 UJK 92 PAM 
departmentC_companyA.try=675 UJK 88 KKR 
departmentC_companyB.try=878 UJK 37 TAR 
departmentC_companyC.try=764 UJK 92 PAM 
+0

Je cherche encore où commencer .. pouvez-vous s'il vous plaît me donner la direction – Sam

+2

Sans savoir quoi que ce soit au sujet de votre connaissance préalable, et sans aucune indication que vous avez fait un certain travail vous-même, la mieux que je peux faire est de suggérer que vous google "comment poser des questions à la manière intelligente" ... –

Répondre

3
  1. Créer une liste de tous les symboles du fichier1
  2. Parcourez file2. Si le critère correspond, supprimez le symbole de la liste.

Dans ce cas, je vous suggère d'utiliser les clés d'un hachage pour stocker cette liste ($symbols{$symbol} = 1;). C'est parce qu'il est facile et bon marché de supprimer d'un hachage (delete $symbols{$symbol};).

Spoiler:

use strict; 
use warnings; 
use feature qw(say); 

my %symbols; 
{ 
    open(my $fh, '<', 'file1') 
     or die("Can't open file1: $!\n"); 

    while (<$fh>) { 
     chomp; 
     ++$symbols{$_}; 
    } 
} 

{ 
    open(my $fh, '<', 'file2') 
     or die("Can't open file2: $!\n"); 

    while (<$fh>) { 
     chomp; 
     my ($key, $val) = split /=/; 
     my ($dept, $co) = split /[_\.]/, $key; 
     if ($co eq 'companyA' || $dept eq 'departmentB' || 'departmentC') { 
     my @symbols = split ' ', $val; 
     delete @symbols{@symbols}; 
     } 
    } 
} 

say for keys %symbols; 
+0

Merci beaucoup .. Je vais regarder dans – Sam

+0

@ Sam, c'est en fait très similaire à la solution de David Nehme. Il est plus précis de trouver des entreprises et des départements. (Par exemple, essayer de trouver le département "IT" ne correspondra pas accidentellement à la société "ACHETEZ-LE!"). C'est plus simple car je ne comptabilise pas le nombre de fois où les choses sont trouvées. C'est plus long parce que j'ai séparé les préoccupations en blocs séparés. – ikegami

+0

@Sam, Correction d'une petite erreur. – ikegami

2

Vous pouvez utiliser un hachage pour compter le nombre de fois que chaque symbole apparaît dans le fichier, puis imprimez ceux qui ont un compte de 0.

use strict; 

open SYMS, $ARGV[0] || die; 
open INFILE, $ARGV[1] || die; 

my %symbols; 

while (<SYMS>) { 
    chomp; 
    $symbols{$_} = 0; 
} 

while (<INFILE>) { 
    my @F=split; 
    next unless $F[0] =~ /companyA/; 
    next unless $F[0] =~ /department[BC]/; 
    ++$symbols{$F[1]} if (defined $symbols{$F[1]}); 
    ++$symbols{$F[3]} if (defined $symbols{$F[3]}); 
} 

for my $symbol (keys %symbols) { 
    print "$symbol\n" if $symbols{$symbol} == 0; 
} 
+0

Merci pour l'aide .... Je vais travailler sur ce – Sam

Questions connexes