Reputation: 2140
So, let's say I am writing a Perl program:
./program.perl 10000 < file
I want it to read the 10000th line of "file" only. How could I do it using input redirection in this form? It seems that I keep getting something along the lines of 10000 is not a file.
I thought this would work:
#!/usr/bin/perl -w
$line_num = 0;
while ( defined ($line = <>) && $line_num < $ARGV[0]) {
++$line_no;
if ($line_no == $ARGV[0]) {
print "$line\n";
exit 0;
}
}
But it failed miserably.
Upvotes: 1
Views: 205
Reputation: 7912
You could also do this very simply using awk:
awk 'NR==10000' < file
or sed:
sed -n '10000p' file
Upvotes: 0
Reputation: 67900
You could use Tie::File
use Tie::File;
my ($name, $num) = @ARGV;
tie my @file, 'Tie::File', $name or die $!;
print $file[$num];
untie @file;
Usage:
perl script.pl file.csv 10000
Upvotes: 1
Reputation: 47099
Obligatory one-liner:
perl -ne 'print if $. == 10000; exit if $. > 10000'
$.
counts lines read from stdin
. -n
implicitly wraps program in:
while (<>) {
...program...
}
Upvotes: 1
Reputation: 183301
If there are command-line arguments, then <>
opens the so-named files and reads from them, and if not, then it takes from standard-input. (See "I/O Operators" in the perlop man-page.)
If, as in your case, you want to read from standard-input whether or not there are command-line arguments, then you need to use <STDIN>
instead:
while ( defined ($line = <STDIN>) && $line_num < $ARGV[0]) {
Upvotes: 3