2014-12-06 3 views
1

Я хочу использовать только Sed в Perl, чтобы захватить содержимое файла между 1000 и 2000 строк в заданном файле. Я попробовал ниже, но это не сработало, может кто-то мне помочь в этом, пожалуйста.Извлечь содержимое файла между данными строками с помощью perl

$firstLIne="1000"; 
$lastline="2000"; 

$output=`sed -n '$firstLIne,$lastline'p sample.txt`; 

ответ

4

Вот еще Перла решение:

my ($firstline, $lastline) = (1000,2000); 
open my $fh, '<', 'sample.txt' or die "$!"; 
while(<$fh>){ 
    print if $. == $firstline .. $. == $lastline; 
} 

, если вы не используете переменные в другом месте, вы можете использовать special use case of .. с константами (4-й пункт, если вы используете постоянное выражение они автоматически по сравнению с $.):

while(<$fh>){ 
    print if 1000 .. 2000; 
} 

Здесь важно часть от perldoc для оператора ..:

В скалярном контексте «..» возвращает логическое значение. Оператор бистабилен, как триггер, и эмулирует линейный (запятая) оператор sed, awk и различных редакторов.

Редактировать По желанию, с хранением промежуточных строк в переменной.

my ($firstline, $lastline) = (1000,2000); 
my $output = ''; 
open my $fh, '<', 'sample.txt' or die $!; 
while(<$fh>){ 
    $output .= $_ if $. == $firstline .. $. == $lastline; 
} 

print $ouput; 

Кроме того, если ваш файл не является слишком большим (он подходит полностью в памяти), вы также можете прочитать его в списке и выберите строки вы заинтересованы в:

my $output = join '', (<$fh>)[$firstline+1..$lastline] 
+1

Приятно узнать о операторе диапазона Perl .. –

+0

@ Hâkon: ссылка, которую я предоставил, является страницей perldoc для (почти всех) операторов. '~' Двоичный обратный упоминается только в таблице приоритетов. Идеома '=() =', хотя и не является строго оператором, но иногда полезен, там не упоминается (полезно, если вы хотите, чтобы какое-то выражение оценивалось в контексте списка, но интересуется только размером результата). –

+0

Спасибо за решение. Могу ли я написать результат команды печати переменной perl. – Reddy

3

Для сравнения, чтобы сделать это только в Perl, можно было бы написать:

my $firstLine=1000; 
my $lastLine=2000; 
my $fn="sample.txt"; 
my $output; 

open (my $fh, "<", $fn) or die "Could not open file '$fn': $!\n"; 
while (<$fh>) { 
    last if $. > $lastLine; 
    $output .= $_ if $. >= $firstLine; 
} 
close($fh); 

Обратите внимание, что это остановит чтение из файла после строки $lastLine .. так что если файл содержит 100000 строк он будет читать только первые 2000 строк ..

1

Если вы просто хотите напечатать строки, то:

perl -ne 'print if 1000 .. 2000' example_data.txt

должен работать.

Если вы хотите, чтобы включить это в сценарий как-то, то вы можете «пол-хлебать» указатель_на_файл:

use strict; 
use warnings; 

open my $filehandle, 'example_data.txt' or die $!; 
my $lines_1k_to_2k ; 

while (<$filehandle>) { 
    $lines_1k_to_2k .= $_ if 1000 .. 2000 ; 
} 

print $lines_1k_to_2k ; 

Оператор .= будет добавить строки в строку в переменной $lines_1k_to_2k только if они находятся в диапазон 1000 .. 2000

Смежные вопросы