レコードを作る。

a1,a2,a3,b1,b2,b3,c1,c2,c3
d1,d2,d3,e1,e2,e3,f1,f2,f3
...

以上のデータが a.txtに入っているとして

cat a.txt|sed 's/,/\n/g'|ruby -e 'while !STDIN.eof? ; print [gets,gets,gets].map{|i|i.chop}.join(","),"\n" ; end'

でよい。

$ seq 12|ruby -e 'while !STDIN.eof? ; print [gets,gets,gets].map{|i|i.chop}.join(","),"\n" ; end'
1,2,3
4,5,6
7,8,9
10,11,12

別解

$ seq 12|ruby -e 'print STDIN.read.gsub(/(.*?)\n(.*?)\n(.*?)\n/,"\\1,\\2,\\3\n")'
1,2,3
4,5,6
7,8,9
10,11,12
$ seq 12|ruby -e 'print STDIN.read.gsub(/(.*?)\n(.*?)\n(.*?)\n/){$~.to_a[1..-1].join(",")+"\n"}'
1,2,3
4,5,6
7,8,9
10,11,12
$ seq 12|ruby -pe '$_=$_.chop+"," if $.%3!=0'
1,2,3
4,5,6
7,8,9
10,11,12

ストリームをリストのように扱うのは難しいな。

perlだときれいにすむ

$ seq 12|perl -pe '$.%3&&s/\n/,/'
1,2,3
4,5,6
7,8,9
10,11,12