Hi List I am writing a perl code which will takes 2 more files as argument. Then It will check the the values of each line of a file with respect with another file. If some value matches then it will write the value along with line number to another ( say outputfile) file.
The source files are as follow Contents of abc.txt 1 2325278241,P0 2 2296250723,MH 3 2296250724,MH 4 2325277178,P0 5 7067023316,WL 6 7067023329,WL 7 2296250759,MH 8 7067023453,WL 9 7067023455,WL 10 5000055413,EA05 ####################################################### Contents of xyz.txt 1 7067023453,WL 2 31-DEC-27,2O,7038590671 3 31-DEC-27,2O,7038596464 4 31-DEC-27,2O,7038596482 5 2296250724,MH 6 31-DEC-27,2O,7038597632 7 31-DEC-27,2O,7038589511 8 31-DEC-11,2O,7038590671 9 7067023455,WL 10 31-DEC-27,2O,7038555744 ############################################################### Contents of pqr.txt 1 2325278241,P0 2 7067023316,WL 3 7067023455,WL 4 2296250724,MH ######################################################## For this requirement I have written the following code which works fine for 2 input files use strict; use warnings; use Benchmark; if(@ARGV < 2) { print "Please enter atleast two or more .orig file names \n"; exit 0; } my @file_names = @ARGV; chomp(@file_names); my @files_to_process; for(@file_names) { if( -s $_){ print "File $_ exists\n"; push(@files_to_process,$_); } elsif( -e $_) { print "File $_ exists but it has zero byte size\n"; } else { print "File $_ does not exists \n"; } } my $count = @files_to_process; if( $count < 2 ) { print "Atleast 2 .orig files are required to continue this program\n"; exit 0; } my $output_file = "outputfile"; my $value = 0; my $start_time = new Benchmark; if( $count >= 2 ) { while ($count) { my ($files_after_processing_pointer,$return_val) = create_itermediate_file (\...@files_to_process,$value); my @files_after_processing = @$files_after_processing_pointer; $count = @files_after_processing; $value = $return_val; @files_to_process = @files_after_processing; } my $end_time = new Benchmark; my $difference = timediff($end_time, $start_time); print "It took ", timestr($difference), " to execute the program\n"; } sub create_itermediate_file { my $file_pointer = $_[0]; my $counter = $_[1]; my @file_content = @$file_pointer; if($counter == 0) { my($first_file,$second_file) = splice (@file_content, 0, 2); open my $orig_first, "<", $first_file or die "could not open $first_file: $!"; open my $orig_second, "<", $second_file or die "could not open $second_file: $!"; open my $output_fh, ">", $output_file or die "could not open $output_file: $!"; my %content_first; while (my $line = <$orig_first>) { chomp $line; if ($line) { my($line_num,$value) = split(" ",$line); $content_first{$value} = $line_num; } } my %content_second; while (my $line = <$orig_second>) { chomp $line; if ($line) { my($line_num,$value) = split(" ",$line); $content_second{$value} = $line_num; } } foreach my $key (sort keys %content_second) { if (exists $content_first{$key} ) { print $output_fh "$content_second{$key} $key" ,"\n"; } } $counter += 1; return (\...@file_content,$counter); } if ($counter != 0) { my $file_pointer = $_[0]; my $counter = $_[1]; my @file_content_mod = @$file_pointer; my($file_to_process) = shift(@file_content_mod); open my $orig_file, "<", $file_to_process or die "could not open $file_to_process: $!"; open my $output_fh, "<", $output_file or die "could not open $output_file: $!"; open my $output_fh_mod, ">", $output_file."_mod" or die "could not open", $output_file."_mod : $!"; my %content_file_to_process; while (my $line =<$orig_file>) { chomp $line; if ($line) { my($line_num,$value) = split(" ",$line); $content_file_to_process{$value} = $line_num; } } my %content_output_file; while (my $line =<$output_fh>) { chomp $line; if ($line) { my($line_num,$value) = split(" ",$line); $content_output_file{$value} = $line_num; } } foreach my $key (sort keys %content_output_file) { if (exists $content_file_to_process{$key} ) { print $output_fh_mod "$content_file_to_process{$key} $key" ,"\n"; } } $counter += 1; return (\...@file_content_mod,$counter); } } But when I am entering 3 file names as argument this is not working.It is working properly though I am using another file $output_file_mod> It was only written the similar lines between two compared files where it should be written the common lines of two compared files as well as lines which were not present in the last file but present in the $output_file. I was trying to use open my $output_fh, "+>>", $output_file or die "could not open $output_file: $!"; syntax but it was not working.) Thanks & Regards in advance Anirban Adhikary.