This is a classic case for my favorite one-liner:

perl -e'while(<>){print unless $seen{$_}++}' <infile >outfile



 

On Wed, 02 Oct 2002 04:17:29 -0400, Sudarshan Raghavan wrote:

> On Fri, 27 Sep 2002, waytech wrote:
> 
>> hi,
>> 
>> i want to remove duplicate lines from one file(original file), and save
>> the result to another file.
>> 
>> the origianl file like this:
>> 
>> 
>--------------------------------------------------------------------------------------------
>> [EMAIL PROTECTED]
>> [EMAIL PROTECTED]
>> [EMAIL PROTECTED]
>> [EMAIL PROTECTED]
>> [EMAIL PROTECTED]
>> [EMAIL PROTECTED]
>> 
>-------------------------------------------------------------------------------------------
>> 
>> with each email address a line. I want to remove the duplicate
>> lines(emais adresses) and
>> 
>> save the result to a new file.
>> 
>> I wrote a program , but it output nothing. can someome help ?
>> 
>> Thanks a lot.
>> 
>>                                                           kevin
>> 
>> 
>-------------------------------------------------------------------------------------------
>> #!/usr/bin/perl -w
>> #######################
>> #Remove the duplicate line   #
>> #from a orginal file and save #
>> #the result to a file.             #
>> #######################
>> print "Enter the file that has duplicate lines.\n";
>> $Dupli_file=<stdin>;
>> chomp;
> 
> chomp by default works on $_, to chomp $Dupli_file you will have to say
> chomp ($Dupli_file);
> 
>> print "The file you select is '$Dupli_file'\n"; open
>> (Dupli_file,"$Dupli_file");
> 
> When opening a file always check for failure like this open (Dupli_file,
> $Dupli_file) or die "Cannot open $Dupli_file: $!\n"; $! will contain the
> error string. For more info on $! (perldoc perlvar)
> 
>> print "Please select the file you want to save the result to:\n";
>> $Resu_file=<stdin>;
>> chomp;
> 
> chomp ($Resu_file);
> 
>> print "The result file is $Resu_file\n"; open
>> (Resu_file,">$Resu_file");
> 
> Check for failure
> 
>> while (<Dupli_file>)
>> {
>>     $orin_line=$_;
>>     while (<Resu_file>){
> 
> You are trying to read from a filehandle that has been  opened for
> writing. This will throw a warning message.
> 
> This logic will not work even if you open the result file for both
> reading and writing. If the result file is empty to start with, the
> execution path will never go into the while loop. while (<Resu_file>)
> will fail the first time, which means nothing gets written into
> Resu_file. This makes it fail again the 2'nd time, 3'rd time ...
> 
>>         if("$_" eq "$orin_line")
>>         {
>>         next;
>>         }
>>         print Resu_file "$orin_line";
>>     };
>> }
>> }
> A hash is more suited for your job
> #!/usr/bin/perl -w
> use strict;
> 
> chomp (my $dupli_file = <STDIN>);
> chomp (my $res_file = <STDIN>);
> 
> open (DUPLI, $dupli_file) or die "Failed to open $dupli_file: $!\n";
> open (RESULT, ">$res_file") or die "Failed to open $res_file for
> writing: $!\n";
> 
> my %res_hash;
> while (<DUPLI>) {
>     chomp;
>     unless ($res_hash{$_}++) {
>         print RESULT "$_\n";
>     }
>     }
> close (DUPLI);
> close (RESULT);

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to