Конвертировать perl one liner в скрипт - PullRequest
0 голосов
/ 27 января 2019

Я Виджей, я студент и очень заинтересован в изучении сценариев на Perl.Я узнал о Perl на вкладыше.Я хотел бы написать Perl-скрипт, который проходит через файл строка за строкой и сравнивает каждую строку с предыдущей строкой (или следующей строкой), чтобы найти совпадающие значения в первых 3 столбцах.Затем я хотел бы напечатать значения в первых трех столбцах только один раз, при этом значение четвертого столбца будет добавлено как новый столбец. Например,

1 760605 769233 15.65  
1 760605 769233 44.11  
1 760605 769233 18.5 

Выходные данные должны быть

1 760605 769233 15.65 44.11 18.5

Один вкладыш для этого -

perl -ape '$k="@F[0..2]"; $_=" $F[3]",next if $k eq $o; $_= "\n@F";$o=$k' filename

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

Спасибо.

1 Ответ

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

Как сказал @Corion, B::Deparse может помочь здесь.

$ perl -MO=Deparse -ape '$k="@F[0..2]"; $_=" $F[3]",next if $k eq $o; $_= "\n@F";$o=$k'
LINE: while (defined($_ = readline ARGV)) {
    our @F = split(' ', $_, 0);
    $k = join($", @F[0..2]);
    $_ = " $F[3]", next if $k eq $o;
    $_ = "\n@F";
    $o = $k;
}
continue {
    die "-p destination: $!\n" unless print $_;
}

Очистка этого в довольно эквивалентный сценарий:

#!/usr/bin/env perl
use warnings;
use strict;

my $o;
while ( my $line = <> ) {
    my @fields = split ' ', $line;
    my $k = "@fields[0..2]";
    if (defined $o && $k eq $o) {
        $line = " $fields[3]";
        next;
    }
    $line = "\n@fields";
    $o = $k;
} continue { print $line }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...