Count number of lines in a text file
Scott7477
created: 2006-03-23 13:52:55
Short and simple...I borrowed the counting code from ActiveState's Perl docs and added some to make this accessible from the command line.
#Count number of lines in a file
$filename = <@ARGV>;
 $lines = 0;
    open(FILE, $filename) or die "Can't open `$filename': $!";
    while (sysread FILE, $buffer, 4096) {
        $lines += ($buffer =~ tr/\n//);
    }
    close FILE;
print "The number of lines in $filename is $lines.\n";

Re: Count number of lines in a text file
created: 2006-03-23 14:10:56
different approach using [cpan://Tie::File] (should also work w/large files):
perl -MTie::File -MFcntl=O_RDONLY -le 'tie @array, "Tie::File", shift, mode => O_RDONLY or die $!; print scalar @array' /etc/hosts
.. and of course there's wc on *nix or from ppt
Re: Count number of lines in a text file
created: 2006-03-23 15:04:14
Here's another variation that gets rid of a few lines:
open (FILE, $ARGV[0]) or die "Can't open '$ARGV[0]': $!";
$lines++ while ();
close FILE;
print "$lines\n";
Re^2: Count number of lines in a text file
created: 2006-03-23 15:45:59
don't need $lines -- $. does it for you (see [perldoc://perlvar])
perl -le 'open FILE, "/etc/passwd"; @_=; print $.'
And (similar to [QM]'s golf reply:
perl -lne 'END{print $.}' /etc/passwd
Re: Count number of lines in a text file
QM
created: 2006-03-23 15:31:30
What about this oft-quoted golf shot?
perl -pe '}{$_=$.' filename

-QM
--
Quantum Mechanics: The dreams stuff is made of

Re^2: Count number of lines in a text file
created: 2006-03-24 05:29:50
Very tricky. So because of the }, the continue { print $_; } block is no longer attached to the loop, but to the {$_=$.} bare block. I never knew this trick with -p. (I knew about -ne '...}{...' but not what it did with -p.)
Re^3: Count number of lines in a text file
QM
created: 2006-03-28 10:07:26
Yes. But -p and -n only differ by the continue/print. Compare -p:
> perl -MO=Deparse -pe"#stuff#"
LINE: while (defined($_ = )) {
    ();
}
continue {
    print $_;
}
to -n:
> perl -MO=Deparse -ne"#stuff#"
LINE: while (defined($_ = )) {
    ();
}

-QM
--
Quantum Mechanics: The dreams stuff is made of

Re: Count number of lines in a text file
created: 2006-03-24 05:36:58

Here's yet another golf variation, provided there's only one filename and that's a real filename (not a glob or something you can give to the two-arg open):

exec wc,-ll,pop
Re: Count number of lines in a text file
created: 2006-03-28 02:24:53

Hi try this,

#! /usr/bin/perl
use strict;
open(IN, "test.txt");
my @str = ;
close(IN);
print scalar(@str);
Re^2: Count number of lines in a text file
QM
created: 2006-03-28 09:23:35
Excuse my French, but why the **censored** would you store the whole file in memory just to count the lines? Why hardcode the filename in the script? Why bother to open and close the file, when <> is so handy?

Sorry, please forgive the tirade, I don't know what came over me. It must be the ghost of [Abigail-II]...Certainly [TIMTOWTDI]. (I find many of my cow-orkers skip over the "gather requirements" phase of programming, and jump headfirst into the shallow end of the implementation pool.)

While playing with this, I wanted to check how similar schemes work. For instance, don't do this either:

perl -e 'print scalar(()=<>),"\n"' filename
I tried this on a 300MB file, which took a long time (I waited several minutes before killing it), lots of memory, and started swapping to disk.

I tried the following on the same 300MB file, which took about 10 seconds, and never went above 2MB memory:

perl -pe "}{$_=$." filename
Inside a script, you could do this:
#!/your/perl/here -p
}{$_=$.
(yes, that compiles and runs too) though you may prefer the more conventional
#!/your/perl/here
use strict;
use warnings;
while (<>) {}
print "$.\n";
If you want to get fancy, and feed it more than one file at a time, keeping track of each file, try this:
#!/your/perl/here
use strict;
use warnings;
my $file_count = @ARGV;
while (<>) {}
continue
{ 
  if (eof)
  {
    # print file names for multiple files
    print "$ARGV: " if ($file_count > 1);
    print "$.\n";
    close ARGV;
  }
}
Someone will ask me for command line arguments to leave off the filenames, and provide summary statistics for multiple files. I'll leave that to [OMAR]. (Wow, there really is an [OMAR]! But he doesn't write much :(

-QM
--
Quantum Mechanics: The dreams stuff is made of

perlmonks.org content © perlmonks.org and ambrus, aweeraman, davidrw, gube, QM, Scott7477

prlmnks.org © 2006 edmund von der burg (eccles & toad)

v 0.03