Как записать из n-й строки в файл, используя perl - PullRequest
1 голос
/ 29 июля 2010

У меня есть исходный текст в файле, и я ищу код, который бы взял вторую (или n-ю - в общем) строку из этого файла и распечатал в отдельный файл.

Есть идеи, как это сделать?

Ответы [ 5 ]

5 голосов
/ 29 июля 2010

Вы можете сделать это изначально в Perl с помощью оператора триггер и специальной переменной $. (используется внутри ..), которая содержит номер текущей строки :

# 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

0 голосов
/ 29 июля 2010

используйте как этот скрипт.pl> outfile (или >> outfile для добавления)

здесь используются лексические файловые дескрипторы и 3 аргумента открытия, которые предпочтительнее глобальных файловых дескрипторов и 2 аргумента открытия.

#!/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";
    }
}
0 голосов
/ 29 июля 2010

Я думаю, что это будет делать то, что вы хотите:

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, и это будет писать 2-йстрока из file_to_read_from.txt в file_to_write_to.txt.

0 голосов
/ 29 июля 2010
my $content = `tail -n +$line $input`;

open OUTPUT, ">$output" or die $!;
print OUTPUT $content;
close OUTPUT;
0 голосов
/ 29 июля 2010

Вы всегда можете:

  1. Считать все файлы в и только в одну переменную.
  2. Разделить переменную на новую строку и сохранить в массиве
  3. Запишите значение по индексу 1 (для второй строки) или позиции n-1 в отдельный файл
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...