Каков наилучший способ конвертировать "awk '{print $ 2 >> $ 1}' file" в однострочник Perl? - PullRequest
3 голосов
/ 03 октября 2010

Как я могу конвертировать:

awk '{print $2 >> $1}' file

в коротком однострочном Perl?

"файл" может выглядеть так:

фруктовый банан
овощная свекла
овощная морковь
грибная лисичка
фруктовое яблоко

Ответы [ 4 ]

5 голосов
/ 03 октября 2010

могут быть и другие способы, но вот что я могу придумать

perl -ane 'open(FILE,">>",$F[0]); print FILE $F[1];close(FILE);' file
4 голосов
/ 03 октября 2010

Я думаю, что awk должен быть лучше в некоторых вещах: -)

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

$ perl -lane '$fh{$F[0]} || open $fh{$F[0]}, ">>", $F[0]; print {$fh{$F[0]}} $F[1]' file
2 голосов
/ 03 октября 2010

Не чистый Perl, но вы можете сделать:

perl -nae '`echo $F[1] >> $F[0]`' input_file
1 голос
/ 05 октября 2010

Это то, что a2p <<< '{print $2 >> $1}' производит

#!/usr/bin/perl
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
    if $running_under_some_shell;
                        # this emulates #! processing on NIH machines.
                        # (remove #! line above if indigestible)

eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;
                        # process any FOO=bar switches

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

while (<>) {
    ($Fld1,$Fld2) = split(' ', $_, -1);
    &Pick('>>', $Fld1) &&
        (print $fh $Fld2);
}

sub Pick {
    local($mode,$name,$pipe) = @_;
    $fh = $name;
    open($name,$mode.$name.$pipe) unless $opened{$name}++;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...