在Perl一行中转换“awk”{print $ 2>> $ 1}'文件'的最佳方法是什么?

时间:2010-10-03 07:48:43

标签: perl awk

我怎么能转换:

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

用简短的Perl单线程?

“file”可能如下所示:

  

水果香蕉
  蔬菜甜菜根
  蔬菜胡萝卜
  蘑菇鸡油菌   水果苹果

4 个答案:

答案 0 :(得分:5)

可能还有其他一些方法,但这就是我能想到的

perl -ane 'open(FILE,">>",$F[0]); print FILE $F[1];close(FILE);' file

答案 1 :(得分:4)

我想awk在某些方面必须做得更好: - )

这是我在命令行上所做的极限,但它避免重新打开文件句柄。

$ perl -lane '$fh{$F[0]} || open $fh{$F[0]}, ">>", $F[0]; print {$fh{$F[0]}} $F[1]' file

答案 2 :(得分:2)

不是纯粹的Perl,但你可以这样做:

perl -nae '`echo $F[1] >> $F[0]`' input_file

答案 3 :(得分:1)

这是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}++;
}