command for script

command for script

am 03.10.2007 19:52:45 von jan09876

A friend wrote for me this little script so I can compare two files
and have this output.

Common to all files:
====================
Only in '1.txt':
====================
Only in '2.txt':
====================
I did not use the script for a while and now I am not able to find out
what the command was. I tried different commands but the script keep
on saying: No such file or directory. I have 1.txt and 2.txt as files
that I want to compare.


../same.pl -in1 1.txt -in2 2.txt -same out1.txt -diff out2.txt

Many thanks for your help


#!/usr/bin/perl

use strict;
use Getopt::Long;

my $USAGE =
"same.pl [--in1 inputfile1 --in2 inputfile2 --same outputSameWords --
diff outputDiffWords]
Compares the 2 in files and checks the same and different words";

my %opts;
GetOptions(\%opts, qw(in1=s in2=s same=s diff=s)) || die $USAGE;

my $fs1 = $opts{in1};
my $fs2 = $opts{in2};
my $out1 = $opts{same};
my $out2 = $opts{diff};

main();
print "done!";

sub main {
open (OUT1, ">out1.txt");
open (OUT2, ">out2.txt");
parse();
close OUT1;
close OUT2;
}

sub parse {
my $_words1 = getWords($fs1);
my $_words2 = getWords($fs2);
for (sort keys %$_words1) {
if (exists $_words2->{$_}) {
print OUT1 "$_\n";
}
else {
print OUT2 "$_\n";
}
}
}

sub getWords {
my $fs = shift;
my $txt = getFile($fs);
my %words;
while ($txt =~ m/(\w+)/g) {
$words{$1} = 1;
}
return \%words;
}

sub getFile {
my $fs = shift;
open (IN, $fs) or die "cant open $fs";
my $txt = do{local $/;};
return $txt;
}

Re: command for script

am 03.10.2007 23:28:05 von Jim Gibson

In article <1191433965.875513.50640@g4g2000hsf.googlegroups.com>,
wrote:

> A friend wrote for me this little script so I can compare two files
> and have this output.
>
> Common to all files:
> ====================
> Only in '1.txt':
> ====================
> Only in '2.txt':
> ====================
> I did not use the script for a while and now I am not able to find out
> what the command was. I tried different commands but the script keep
> on saying: No such file or directory. I have 1.txt and 2.txt as files
> that I want to compare.
>
>
> ./same.pl -in1 1.txt -in2 2.txt -same out1.txt -diff out2.txt

That line above is, in fact, the command you should use to run your
script, assuming that the script is named 'same.pl', resides in your
current default directory, your computer has the executable
/usr/bin/perl installed, and your input files are named '1.txt' and
'2.txt' in your current default directory. Are all of these things
true? If so, your program should work and it is not clear exactly what
you are asking.

If you are getting the error message 'No such file or directory', then
the input files you have specified on the command line do not exist.


> #!/usr/bin/perl
>
> use strict;
> use Getopt::Long;
>
> my $USAGE =
> "same.pl [--in1 inputfile1 --in2 inputfile2 --same outputSameWords --
> diff outputDiffWords]
> Compares the 2 in files and checks the same and different words";
>
> my %opts;
> GetOptions(\%opts, qw(in1=s in2=s same=s diff=s)) || die $USAGE;
>
> my $fs1 = $opts{in1};
> my $fs2 = $opts{in2};
> my $out1 = $opts{same};
> my $out2 = $opts{diff};
>
> main();
> print "done!";
>
> sub main {
> open (OUT1, ">out1.txt");

The above line should be

open (OUT1, '>', $out1) or die("Can't open $out1 for writing: $!);

to 1) actually use the -same option parameter, 2) use the more reliable
3-argument version of open, and 3) check to see if the open actually
worked.

> open (OUT2, ">out2.txt");

Ditto.

> parse();
> close OUT1;
> close OUT2;
> }
>
> sub parse {
> my $_words1 = getWords($fs1);
> my $_words2 = getWords($fs2);
> for (sort keys %$_words1) {
> if (exists $_words2->{$_}) {
> print OUT1 "$_\n";
> }
> else {
> print OUT2 "$_\n";
> }
> }
> }

This program does not check for words in file 2 that are not in file 1.
That would involve replicating the for loop above but exchanging
$_words1 and $_words2, not printing to OUT1, and opening and printing
to another output file (e.g. OUT3 => 'out3.txt').

>
> sub getWords {
> my $fs = shift;
> my $txt = getFile($fs);
> my %words;
> while ($txt =~ m/(\w+)/g) {
> $words{$1} = 1;
> }
> return \%words;
> }
>
> sub getFile {
> my $fs = shift;
> open (IN, $fs) or die "cant open $fs";
> my $txt = do{local $/;};
> return $txt;
> }
>

--
Jim Gibson

Posted Via Usenet.com Premium Usenet Newsgroup Services
----------------------------------------------------------
** SPEED ** RETENTION ** COMPLETION ** ANONYMITY **
----------------------------------------------------------
http://www.usenet.com

Re: command for script

am 04.10.2007 00:42:51 von rvtol+news

jan09876@hotmail.com schreef:

> A friend wrote for me this little script so I can compare two files
> and have this output.
> [...]
> I did not use the script for a while and now I am not able to find out
> what the command was.

The script has a usage section, so just start it without any parameters
(or with -h), and it will show the syntax.

(instead of -in1 I guess you need to use --in1, etc.)

--
Affijn, Ruud

"Gewoon is een tijger."

Re: command for script

am 05.10.2007 15:25:48 von Jan Pluntke

jan09876@hotmail.com writes:

> I did not use the script for a while and now I am not able to find out
> what the command was. I tried different commands but the script keep
> on saying: No such file or directory.

This text is not output anywhere in the script you pasted below, so I
believe it is the shell and not the perl program that complains
here. Do ./same.pl and /usr/bin/perl exist on your system?

Regards,
Jan

Re: command for script

am 05.10.2007 15:37:09 von Josef Moellers

jan09876@hotmail.com wrote:
> A friend wrote for me this little script so I can compare two files
> and have this output.
>=20
> Common to all files:
> ====================
> Only in '1.txt':
> ====================
> Only in '2.txt':
> ====================
> I did not use the script for a while and now I am not able to find out
> what the command was. I tried different commands but the script keep
> on saying: No such file or directory.

Maybe you have transferred this script back and forth via a machine that =

uses ancient CRLF line terminators (abandoned shortly after stone=20
tablets cam out of fashion).
In that case the shebang line (the "#!/usr/bin/perl") will actually read =

"#!/usr/bin/perl" and it is highly unlikely that you'll have a=20
command of that name on your system.
Use whatever means you have at your disposal to get rid of the CR=20
characters, e.g.
tr -d '\015' < script > tmp.$$; mv tmp.$$ script
or open the file in vim (notice that it'll say "[DOS]" in the last=20
line), then type ":set fileformat=3Dunix", then ":wq".

Josef
--=20
These are my personal views and not those of Fujitsu Siemens Computers!
Josef Möllers (Pinguinpfleger bei FSC)
If failure had no penalty success would not be a prize (T. Pratchett)
Company Details: http://www.fujitsu-siemens.com/imprint.html