使用Perl程序和命令行参数读取特定行

时间:2012-07-14 21:28:52

标签: linux perl

所以,假设我正在编写一个Perl程序:

./program.perl 10000 < file

我希望它只读取第10000行的“文件”。我怎么能用这种形式的输入重定向呢?似乎我不断得到10000行的东西不是文件。

我认为这样可行:

#!/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;
    }
}

但它失败了。

4 个答案:

答案 0 :(得分:3)

如果有命令行参数,则<>打开所谓的文件并从中读取,如果没有,则从标准输入获取。 (见"I/O Operators" in the perlop man-page。)

如果您希望从标准输入中读取是否存在命令行参数,那么您需要使用<STDIN>代替:

while ( defined ($line = <STDIN>) && $line_num < $ARGV[0]) {

答案 1 :(得分:1)

您可以使用Tie::File

use Tie::File;
my ($name, $num) = @ARGV;
tie my @file, 'Tie::File', $name or die $!;

print $file[$num];
untie @file;

<强>用法:

perl script.pl file.csv 10000

答案 2 :(得分:1)

强制性单行:

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

$.计算从stdin读取的行数。 -n隐式包含程序:

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

答案 3 :(得分:0)

您也可以使用awk简单地执行此操作:

awk 'NR==10000' < file

或sed:

sed -n '10000p' file