Perl script to compare two files


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Perl script to compare two files
# 1  
Old 09-13-2010
Perl script to compare two files

hi,
As such I am new to perl on google search I found a code for Perl script to compare two files and print differences between them and instead of prinintg I want to store the diff. in a outputfile so can sombody provide assistance upon this from where can I edit in script to store the diff in output file..
Code:
##!/usr/bin/perl
# file_compare.pl
# Purpose: compare two files and show differences
# usage: file_compare.pl filename1 filename2
use strict;
use warnings;
my $file1 =
  'C:\Documents and Settings\dinesh.lohan\Desktop\comparing_file\file1.txt';
my $file2 =
  'C:\Documents and Settings\dinesh.lohan\Desktop\comparing_file\file2.txt';
open( FILE1, "< $file1" ) or die "Can not read file $file1: $! \n";
my @file1_contents = <FILE1>;    # read entire contents of file
close(FILE1);
open( FILE2, "< $file2" ) or die "Can not read file $file2: $! \n";
my @file2_contents = <FILE2>;    # read entire contents of file
close(FILE2);
my $length1 = $#file1_contents;    # number of lines in first file
my $length2 = $#file2_contents;    # number of lines in second file

if ( $length1 > $length2 ) {

    # first file contains more lines than second file
    my $counter2 = 0;
    foreach my $line_file1 (@file1_contents) {
        chomp($line_file1);
        if ( defined( $file2_contents[$counter2] ) ) {

            # line exists in second file
            chomp( my $line_file2 = $file2_contents[$counter2] );
            if ( $line_file1 ne $line_file2 ) {
                print "\nline " . ( $counter2 + 1 ) . " \n";
                print "< $line_file1 \n" if ( $line_file1 ne "" );
                print "--- \n";
                print "> $line_file2 \n\n" if ( $line_file2 ne "" );
            }
        }
        else {

            # there is no line in second file
            print "\nline " . ( $counter2 + 1 ) . " \n";
            print "< $line_file1 \n" if ( $line_file1 ne "" );
            print "--- \n";
            print "> \n";    # this line does not exist in file2
        }
        $counter2++;         # point to the next line in file2
    }
}
else {

    # second file contains more lines than first file
    # or both have equal number of lines
    my $counter1 = 0;
    foreach my $line_file2 (@file2_contents) {
        chomp($line_file2);
        if ( defined( $file1_contents[$counter1] ) ) {

            # line exists in first file
            chomp( my $line_file1 = $file1_contents[$counter1] );
            if ( $line_file1 ne $line_file2 ) {
                print "\nline " . ( $counter1 + 1 ) . " \n";
                print "< $line_file1 \n" if ( $line_file1 ne "" );
                print "--- \n";
                print "> $line_file2 \n" if ( $line_file2 ne "" );
            }
        }
        else {

            # there is no line in first file
            print "\nline " . ( $counter1 + 1 ) . " \n";
            print "< \n";    # this line does not exist in file1
            print "--- \n";
            print "> $line_file2 \n" if ( $line_file2 ne "" );
        }
        $counter1++;         # point to next line in file1
    }
}

Moderator's Comments:
Mod Comment [TABLE] isn't suitable for [CODE]. And correctly formatting your code increases readability a lot


---------- Post updated at 07:45 AM ---------- Previous update was at 07:16 AM ----------

Hi,
Apart from above script I found one more script which will save the diff. in output file.
Suppose a.txt file

315: posedge SYS_CLK_IR)
^^^^^^^
vx1_bit_align.v:315: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
Coding Standard

170: posedge RD_CLK_IR)
^^^^^^^
vx1_ff_dpram.v:170: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
Coding Standard


202: posedge RD_CLK_IR)
^^^^^^^
vx1_fifo_ctrl.v:202: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
Coding Standard


267: posedge PIXEL_CLK_IR)
^^^^^^^
vx1_resizer.v:267: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected

and the second file is a.txt

170: posedge RD_CLK_IR)
^^^^^^^
vx1_ff_dpram.v:170: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
and the diff. of these two will be save in ouput file 1.txt is
vx1_resizer.v:267: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
315: posedge SYS_CLK_IR)
vx1_fifo_ctrl.v:202: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
vx1_bit_align.v:315: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
267: posedge PIXEL_CLK_IR)
202: posedge RD_CLK_IR)

From output file I canclude its printing the diff of these two file in a random manner not in proper sequence as such in input file.so please help me where is error in code because diff of file is printed randomly.
Hope so I cleared my Problem.

Code:
#!/usr/bin/perl -W
use strict;
use warnings; 
my $f1 = 'C:\Documents and Settings\dinesh.lohan\Desktop\comparing_file\2.txt';
my $f2 = 'C:\Documents and Settings\dinesh.lohan\Desktop\comparing_file\a.txt';
my $outfile = 'C:\Documents and Settings\dinesh.lohan\Desktop\comparing_file\1.txt';
my %results = (); 
open FILE1, "$f1" or die "Could not open file: $! \n";
while(my $line = <FILE1>){   $results{$line}=1;
}
close(FILE1); 
open FILE2, "$f2" or die "Could not open file: $! \n";
while(my $line =<FILE2>) {  
 $results{$line}++;
}
close(FILE2);  
open (OUTFILE, ">$outfile") or die "Cannot open $outfile for writing \n";
foreach my $line (keys %results) { print OUTFILE $line if $results{$line} == 1;
}
close OUTFILE;



---------- Post updated at 07:46 AM ---------- Previous update was at 07:45 AM ----------

Hi,
Apart from above script I found one more script which will save the diff. in output file.
Suppose a.txt file

315: posedge SYS_CLK_IR)
^^^^^^^
vx1_bit_align.v:315: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
Coding Standard

170: posedge RD_CLK_IR)
^^^^^^^
vx1_ff_dpram.v:170: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
Coding Standard


202: posedge RD_CLK_IR)
^^^^^^^
vx1_fifo_ctrl.v:202: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
Coding Standard


267: posedge PIXEL_CLK_IR)
^^^^^^^
vx1_resizer.v:267: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected

and the second file is 2.txt

170: posedge RD_CLK_IR)
^^^^^^^
vx1_ff_dpram.v:170: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
and the diff. of these two will be save in ouput file 1.txt is
vx1_resizer.v:267: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
315: posedge SYS_CLK_IR)
vx1_fifo_ctrl.v:202: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
vx1_bit_align.v:315: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
267: posedge PIXEL_CLK_IR)
202: posedge RD_CLK_IR)

From output file I canclude its printing the diff of these two file in a random manner not in proper sequence as such in input file.so please help me where is error in code because diff of file is printed randomly.
Hope so I cleared my Problem.

Code:
#!/usr/bin/perl -W
use strict;
use warnings; 
my $f1 = 'C:\Documents and Settings\dinesh.lohan\Desktop\comparing_file\2.txt';
my $f2 = 'C:\Documents and Settings\dinesh.lohan\Desktop\comparing_file\a.txt';
my $outfile = 'C:\Documents and Settings\dinesh.lohan\Desktop\comparing_file\1.txt';
my %results = (); 
open FILE1, "$f1" or die "Could not open file: $! \n";
while(my $line = <FILE1>){   $results{$line}=1;
}
close(FILE1); 
open FILE2, "$f2" or die "Could not open file: $! \n";
while(my $line =<FILE2>) {  
 $results{$line}++;
}
close(FILE2);  
open (OUTFILE, ">$outfile") or die "Cannot open $outfile for writing \n";
foreach my $line (keys %results) { print OUTFILE $line if $results{$line} == 1;
}
close OUTFILE;


Last edited by pludi; 09-13-2010 at 09:26 AM..
# 2  
Old 09-13-2010
Quote:
Originally Posted by dinesh.4126
... instead of prinintg I want to store the diff. in a outputfile ...
...
The code snippet in your post about the meaning of "unless" had the print command to print to an output file. Have a look at that.
Also check the Perl documentation for the "print" function.

tyler_durden
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

perl Compare zone files in directory with what is listed in named.conf

I would really appreciate any assistance that I can get here. I am fairly new to perl. I am trying to rewrite my shell scripts to perl. Currently I have a shell script (using sed, awk, grep, etc) that gets a list of all of the zone files in a directory and then looks in named.conf for what... (0 Replies)
Discussion started by: brianjb
0 Replies

2. Shell Programming and Scripting

Compare intervals (columns) from two files (awk, grep, Perl?)

Hi dear users, I need to compare numeric columns in two files. These files have the following structure. K.txt (4 columns) A001 chr21 9805831 9846011 A002 chr21 9806202 9846263 A003 chr21 9887188 9988593 A003 chr21 9887188 ... (2 Replies)
Discussion started by: jcvivar
2 Replies

3. Shell Programming and Scripting

Perl: compare columns of two files

Hi I have file 1 like this: file 2 is like this: The files are tab separated. I want to search for the first column values of file 1 in the first column of file 2 and merge the 3rd column value of file 2 to the corresponding line on first file. so the desired output is; I tried following... (2 Replies)
Discussion started by: polsum
2 Replies

4. Shell Programming and Scripting

Need Perl script to compare two CSV files

Need perl script to compare the two CSV files and and give out put in CSV format File MsPMTP.csv File ProfileNames.csv MsPMTP.csv is having lines like below JBL_VIJ_A_A962/r01sr4sl12/port#01-#13-Au4P-4c-TMi-PMNETR15 JBL_VIJ_A_A962/r01sr4sl12/port#01-#13-Au4P-4c-TMi-PMFETR15... (9 Replies)
Discussion started by: sreedhargouda
9 Replies

5. Shell Programming and Scripting

Compare two files and set a third one using awk or perl

Folks I need your help cuz I've a file with 100,000 records that need to be compared against a passwd file (300) and then create a third one with the data in the first one and the passwd from the second one set in it. The format of the first file is: host xxxxxx "" 0,0 Closed control00/... (4 Replies)
Discussion started by: ranrodrig
4 Replies

6. Shell Programming and Scripting

Perl Script to compare between two baseline in UCM

Hello guys, I have written a script which will differentiate between two baseline in UCM: The two baseline is passed as an argument from command line. Now i can see the output in a .txt file,where it will give you the ouput in this way..... ... (2 Replies)
Discussion started by: suvenduperl
2 Replies

7. Shell Programming and Scripting

Use Perl In Bash Script To Compare Floationg Points

Is there a way to compare two floating points numbers in a bash script using perl? I've tried just using a bash if statement and it doesn't seem to support floating point numbers. Can the perl line read vars from bash then output a var to bash? a=1.1 #from bash b=1.5 #from bash if... (3 Replies)
Discussion started by: Grizzly
3 Replies

8. UNIX for Dummies Questions & Answers

How to compare csv files using perl

I need to compare 2 csv files and report should containg number of matching lines,different lines ,missing lines in one file using perl. I dont want to use read line by line and scan thru the second file for matching line ,as this logic was so time consuming .Can other ideas .please respond asap... (2 Replies)
Discussion started by: kittu1979
2 Replies

9. UNIX for Dummies Questions & Answers

Compare 2 csv files in perl

need to compare 2 csv files and report should containg number of matching lines,different lines ,missing lines in one file using perl. I dont want to use read line by line and scan thru the second file for matching line ,as this logic was so time consuming .Any ideas.i need the soultion badly .... (2 Replies)
Discussion started by: kittu1979
2 Replies

10. Shell Programming and Scripting

compare 2 coloum of 2 diff files using perl script

Hi, i am new to perl scripting.. i am still learing it.. i am asked to write a perl script which should compare 2 coloums of 2 different files. if those 2 coloumn are same the script should store the both the lines in 2 diff files. these are files, file 1: 21767016 226112 char 19136520... (3 Replies)
Discussion started by: vasuki
3 Replies
Login or Register to Ask a Question