O melhor que posso encontrar é
$ echo foo bar baz quux xyxxy thud | tr ' ' '\n' \ | perl -lne '$x.=" $_"; if(!($. % 2)){print $x; $x="";} END{print $x if $x}' foo bar baz quux xyxxy thud
ou o indiscutivelmente mais elegante, embora não mais curto
$ echo foo bar baz quux xyxxy thud bang| tr ' ' '\n' \ | perl -ne 'chomp; print "$_ "; print "\n" if (!($. % 3)); END {print "\n"}' foo bar baz quux xyxxy thud bang
Eficiência?
$ time perl -e 'print "foo\n" for (1..10000)' | xargs -n 3 > /dev/null real 0m1.330s user 0m0.500s sys 0m0.830s $ time perl -e 'print "foo\n" for (1..10000)' \ | perl -ne 'chomp; print "$_ "; print "\n" if (!($. % 3)); END {print "\n"}' \ > /dev/null real 0m0.060s user 0m0.030s sys 0m0.030s
Inicialmente, eu tentei o 1000000, mas me cansei de esperar pelos xargs, embora o perl tenha sido 1.45s
(Temporizações feitas no andLinux no Vista-32 em um AMD-64 x2 5600+ 2.8GHz com 4GB de RAM)