Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

hi, i'm new to perl and i'm trying to compare two files and get the first columns of each file and comparing the data...what i have in mind is this:
open (FILE1, $file1); open (FILE2, $file2); for (FILE1) { chomp; @filearray1 = split; for (FILE2) { chomp; @filearray2 = split; if ($filearray1[0] eq $filearray2[0]) { print $filearray1[0]; print $filearray2[0]; } } }
thanks for any suggestions....

Replies are listed 'Best First'.
Re: comparing files
by metadatum (Scribe) on Aug 22, 2002 at 20:21 UTC
    unless you are just trying to compare the first 2 columns, I would use File::Compare:
    use File::Compare; if (compare("file1","file2") == 0) { print "They're equal\n"; }
Re: comparing files
by sauoq (Abbot) on Aug 22, 2002 at 21:07 UTC
    # First suggestion: add error checking. open (ONE, $file1) or die "Couldn't open $file1: $!\n"; open (TWO, $file2) or die "Couldn't open $file2: $!\n"; # 2nd suggestion: check syntax. while ($line1 = <ONE>) { # 3rd suggestion: eliminate unneeded loops. $line2 = <TWO>; # 4th suggestion: don't chomp if you don't need to. # 5th suggestion: If you don't need the whole array, don't keep it +. $element1 = (split ' ', $line1, 2)[0]; $element2 = (split ' ', $line2, 2)[0]; # 6th suggestion: Handle either or both cases. if ($element1 ne $element2) { print "$element1 does not equal $element2 at line $.\n"; } else { print "$element1 is the same in both files at line $.\n"; } }
    -sauoq
    "My two cents aren't worth a dime.";
    
      thanks for the help....basically if i have two files, and for every name that matches in the first column (not necessarily the same number of lines in the two files), i want to print out the second and third columns of the second file.....does code in the previous posting make sense? so i have file 1:
      case1 23 home case2 45 match
      and file 2:
      case0 22 match case5 55 home case2 32 match
      so i want my file to print out
      case2 32 match
      thanks for the all the help
        perldoc -q contain
        Found in /usr/lib/perl5/5.6.0/pod/perlfaq4.pod How can I tell whether a list or array contains a certain element? Hearing the word "in" is an indication that you probably should have used a hash, not a list or array, to store your data...
        Populate a hash with the keys as the values of the first column of the first datafile, then loop through the second file and check for the existence of the corresponding number in the hash, as such: (I used pattern matching 'cause that's the first thing that popped into my head, but you can use whatever's best for your particular datafile.)
        my %h1; while (<ONE>) { $h1{$1} = $2 if /^(\d)+\s+(.+)/; } while (<TWO>) { /^(\d)+\s+(.+)/; printf "Match: %s\t%s\n", $1, $2 if exists $h1{$1};
        I don't know how efficient this is, but it works. HTH.

        --

        There are 10 kinds of people -- those that understand binary, and those that don't.

Re: comparing files
by insensate (Hermit) on Aug 22, 2002 at 20:34 UTC
    You can populate your arrays like so:
    open (FILE1, $file1); open (FILE2, $file2); @filearray1=<FILE1>; @filearray2=<FILE2>;
    Then you'll want two arrays containing the first column values of each filearray:
    for(@filearray1){ ($col1)=split; push@colarray1,$col1; } for(@filearray2){ ($col1)=split; push@colarray2,$col1; }
    Then you can manipulate / compare these two arrays as you see fit.
    Jason