简体   繁体   中英

Reading specified line using Perl program and command-line arguments

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.

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]) {

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

Obligatory one-liner:

perl -ne 'print if $. == 10000; exit if $. > 10000'

$. counts lines read from stdin . -n implicitly wraps program in:

while (<>) {
   ...program...
}

You could also do this very simply using awk:

awk 'NR==10000' < file

or sed:

sed -n '10000p' file

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM