如何使用perl从第n行写入文件

时间:2010-07-29 16:53:05

标签: perl

我在文件中有一个源文本,并查找一个代码,该代码将从该文件中获取第二行(或第n行)并打印到单独的文件。

知道怎么做吗?

5 个答案:

答案 0 :(得分:5)

您可以在Perl中使用flip-flop operator和特殊变量$.(由..内部使用)本地执行此操作,其中包含当前行号:

# prints lines 3 to 8 inclusive from stdin:
while (<>)
{
    print if 3 .. 8;
}

或者从命令行:

perl -wne'print if 3 .. 8' < filename.txt >> output.txt

您也可以在没有Perl的情况下执行此操作:head -n3 filename.txt | tail -n1 >> output.txt

答案 1 :(得分:0)

你可以随时:

  1. 读入所有文件,但将其读入一个变量。
  2. 在换行符处拆分变量并存储在数组中
  3. 将索引1(第二行)或n-1位置的值写入单独的文件

答案 2 :(得分:0)

像这样使用script.pl&gt; outfile(或&gt;&gt;&gt;追加文件)

这使用lexical filehandles和3 arg open,它们比全局文件句柄和2 arg open更受欢迎。

#!/usr/bin/perl
use strict;
use warnings;
use English qw( -no_match_vars );
use Carp qw( croak );

my ( $fn, $line_num ) = @ARGV;

open ( my $in_fh, '<', "$fn" ) or croak "Can't open '$fn': $OS_ERROR";

while ( my $line  = <$in_fh> ) {
    if ( $INPUT_LINE_NUMBER == $line_num ) {
        print "$line";
    }
}

注意:$ INPUT_LINE_NUMBER == $。

这是一个稍微改进的版本,可处理任意数量的行号并打印到文件中。

script.pl <infile> <outfile> <num1> <num2> <num3> ...

#!/usr/bin/perl
use strict;
use warnings;
use English qw( -no_match_vars );
use Carp qw( croak );
use List::MoreUtils qw( any );

my ( $ifn, $ofn, @line_nums ) = @ARGV;

open ( my $in_fh , '<', "$ifn" ) or croak "can't open '$ifn': $OS_ERROR";
open ( my $out_fh, '>', "$ofn" ) or croak "can't open '$ofn': $OS_ERROR";

while ( my $line  = <$in_fh> ) {
    if ( any { $INPUT_LINE_NUMBER eq $_ } @line_nums ) {
        print { $out_fh } "$line";
    }
}

答案 3 :(得分:-1)

我认为这会做你想做的事情:

line_transfer_script.pl:

open(READFILE, "<file_to_read_from.txt");
open(WRITEFILE, ">File_to_write_to.txt");

my $line_to_print = $ARGV[0]; // you can set this to whatever you want, just pass the line you want transferred in as the first argument to the script
my $current_line_counter = 0;

while( my $current_line = <READFILE> ) {
  if( $current_line_counter == $line_to_print ) {
     print WRITEFILE $current_line;
  }

  $current_line_counter++;
}

close(WRITEFILE);
close(READFILE);

然后你会把它称为:perl line_transfer_script.pl 2,这会把第二行从file_to_read_from.txt写入file_to_write_to.txt。

答案 4 :(得分:-1)

my $content = `tail -n +$line $input`;

open OUTPUT, ">$output" or die $!;
print OUTPUT $content;
close OUTPUT;