Perl: извлечение строк от 1 до n (Windows) - PullRequest
3 голосов
/ 01 ноября 2010

Я хочу извлечь строки с 1 по n из моего файла .csv. Используя это

perl -ne 'if ($. == 3) {print;exit}' infile.txt 

Я могу извлечь только одну строку. Как поместить диапазон строк в этот скрипт?

Ответы [ 3 ]

11 голосов
/ 01 ноября 2010

Если у вас есть только один диапазон и один, возможно, каскадный входной поток, вы можете использовать:

#!/usr/bin/perl -n
if (my $seqno = 1 .. 3) {
    print;
    exit if $seqno =~ /E/;
}

Но если вы хотите, чтобы он применялся к каждому входному файлу, вам нужно поймать конец каждого файла:

#!/usr/bin/perl -n
print if my $seqno = 1 .. 3;
close ARGV if eof || $seqno =~ /E/;

И если вы хотите быть добрыми к людям, которые забывают аргументы, добавьте приятное предупреждение в BEGIN или INIT предложении:

#!/usr/bin/perl -n
BEGIN { warn "$0: reading from stdin\n" if @ARGV == 0 && -t }
print if my $seqno = 1 .. 3;
close ARGV if eof || $seqno =~ /E/;

Известные пункты включают в себя:

  • Вы можете использовать -n или -p в строке #!. Вы также можете поместить некоторые (но не все) другие ключи командной строки , например ‑l или ‑a.

  • Числовые литералы как операнды к скалярному триггеру оператор каждый сравнивается с readline счетчик, так что скаляр 1 .. 3 действительно ($. == 1) .. ($. == 3).

  • Вызов eof без аргумента и пустых паренов означает последний файл, прочитанный в списке magic ARGV файлов. Это контрастирует с eof(), который является концом всей <ARGV> итерации.

  • Окончательный порядковый номер оператора триггера возвращается с добавлением "E0".

  • Оператор -t, который вызывает libc isatty(3), по умолчанию использует дескриптор STDIN - в отличие от любых других операторов проверки файлов.

  • Блок BEGIN{} возникает во время компиляции, поэтому, если вы попытаетесь декомпилировать этот скрипт с помощью ‑MO=Deparse, чтобы посмотреть, что он действительно делает, эта проверка будет выполнена. С INIT{} не будет.

  • Именно это покажет, что неявный цикл ввода в виде метки называется LINE, который вы, возможно, могли бы в других обстоятельствах использовать в своих интересах.

НТН

2 голосов
/ 01 ноября 2010

Что не так с:

head -3 infile.txt

Если вы действительно должны использовать Perl, то это работает:

perl -ne 'if ($. <= 3) {print} else {exit}' infile.txt 
2 голосов
/ 01 ноября 2010

Вы можете использовать оператор диапазона:

perl -ne 'if (1 .. 3) { print } else { last }' infile.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...