-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Mr. Adhikary,
The following will take any number of files as arguments, in the format you described (I even tested it! :-)). It goes through each line of those files, stuffing (the relevant part of) each line in a 'seen' hash (more on that, and other, hash techniques here if you're interested: http://www.perl.com/pub/a/2006/11/02/all-about-hashes.html). The code below does not keep track of line numbers as you requested, but I think the hash technique used here could help you as you approach a solution to your particular problem. #!/usr/bin/perl use strict; use warnings; use File::Slurp; # This is where 'read_file' lives my %seen; for my $arg ( @ARGV ) { my @lines = read_file( $arg ); for my $line ( @lines ) { chomp $line; my @elems = split / /, $line; my $value = $elems[1]; $seen{$value}++; } } for my $k ( keys %seen ) { print $k, "\n" if $seen{$k} > 1; } Regards, Rich Loveland Anirban Adhikary wrote: > 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. > -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFKBHLI4EG8v4hpG/ERAvcXAJ9YH9vEnpcgtvPPAqlJlpy9N5lXZQCfQlJM zmPRzzSRHCzpi/EwAzDZM8E= =8YbD -----END PGP SIGNATURE----- -- To unsubscribe, e-mail: beginners-unsubscr...@perl.org For additional commands, e-mail: beginners-h...@perl.org http://learn.perl.org/