我在文件中有一个源文本,并查找一个代码,该代码将从该文件中获取第二行(或第n行)并打印到单独的文件。
知道怎么做吗?
答案 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)
你可以随时:
答案 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;