преобразование awk в perl - PullRequest
       3

преобразование awk в perl

3 голосов
/ 27 января 2011

У меня есть каталог, полный файлов, содержащих записи, такие как:

FAKE ORGANIZATION
799 S FAKE AVE
Northern Blempglorff, RI 99xxx


                                                                      01/26/2011
     These items are being held for you at the location shown below each one.
     IF YOU ASKED THAT MATERIAL BE MAILED TO YOU, PLEASE DISREGARD THIS NOTICE.

     The Waltons. The complete  DAXXXX12118198
     Pickup at:CHUPACABRA LOCATION                                 02/02/2011







                                                  GRIMLY, WILFORD
                                                  29 FAKE LANE
                                                  S. BLEMPGLORFF RI  99XXX

Мне нужно удалить все записи с выражением Pickup at:CHUPACABRA LOCATION.

«Разделитель записей»проблема : я не могу коснуться форматирования входного файла - оно должно быть сохранено как .Каждая запись разделена примерно 40+ новыми строками.

Вот несколько awk (это работает):

BEGIN { 
    RS="\n\n\n\n\n\n\n\n\n+" 
    FS="\n"
}
!/CHUPACABRA/{print $0}

Мой удар по perl:

perl -a -F\n -ne '$/ = "\n\n\n\n\n\n\n\n\n+";$\ = "\n";chomp;$regex="CHUPACABRA";print $_ if $_ !~ m/$regex/i;' data/lib51.000

Ничеговернулся.Я не уверен, как указать «разделитель полей» в Perl, кроме как в командной строке.Пробовал утилиту a2p - без кубиков.Для любопытных вот что он производит:

eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z
            # process any FOO=bar switches

#$FS = ' ';     # set field separator
$, = ' ';       # set output field separator
$\ = "\n";      # set output record separator

$/ = "\n\n\n\n\n\n\n\n\n+";
$FS = "\n";

while (<>) {
    chomp;  # strip record separator
    if (!/CHUPACABRA/) {
    print $_; 
   }   
}

Это должно работать под чьей-то коробкой Windows, иначе я бы придерживался awk.

Спасибо!

Bubnoff

РЕДАКТИРОВАТЬ (РЕШЕНО) **

Спасибо, моб!Вот (рабочая) версия сценария Perl (скорректированный вывод a2p):

eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z
            # process any FOO=bar switches

#$FS = ' ';     # set field separator
$, = ' ';       # set output field separator
$\ = "\n";      # set output record separator

$/ = "\n"x10;
$FS = "\n";

while (<>) {
    chomp;  # strip record separator
    if (!/CHUPACABRA/) {
    print $_; 
    }   
}

Не стесняйтесь публиковать улучшения или дополнения CPAN, которые делают это более идиоматичным и / или perl-ish.Спасибо!

Ответы [ 3 ]

2 голосов
/ 27 января 2011

В Perl разделитель записей является литеральной строкой, а не регулярным выражением.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 100 * * * * * * * * * * * * * * * * * * * * * *.awk должен быть лучше для чего-то.: -)

Тем не менее, похоже, что вы можете обойтись без $/="\n" x 10 или что-то в этом роде:

perl -a -F\n -ne '$/="\n"x10;$\="\n";chomp;$regex="CHUPACABRA";
       print if /\S/ && !m/$regex/i;' data/lib51.000

Обратите внимание на дополнительный /\S/ &&, который пропустит пустойпараграфы ввода, содержащие более 20 последовательных символов новой строки.

Кроме того, рассматривали ли вы просто установку Cygwin и наличие awk на вашем компьютере с Windows?

0 голосов
/ 27 января 2011

Знаете ли вы, что Perl поставляется с программой под названием a2p , которая делает именно то, что вы описали, что вы хотите сделать в своем названии?

И, если на вашем компьютере есть Perl, документация для этой программы уже есть:

C> perldoc a2p

Мое собственное предложение - взять книгу Ламы и все равно выучить Perl. Несмотря на то, что люди Python говорят, Perl - отличный и гибкий язык. Если вы знаете shell, awk и grep, вы без проблем поймете многие конструкции Perl.

0 голосов
/ 27 января 2011

Нет необходимости в (большой) конвертации, если вы можете загрузить gawk для windows

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...