$ cat tst.awk
{ a[NR] = $0 }
END {
OFS = ","
numCols = (numCols ? numCols : 1)
numRows = ceil(NR / numCols)
for ( rowNr=1; rowNr<=numRows; rowNr++ ) {
for ( colNr=1; colNr<=numCols; colNr++ ) {
idx = rowNr + ( (colNr - 1) * numRows )
printf "%s%s", a[idx], (colNr<numCols ? OFS : ORS)
}
}
}
function ceil(x, y){y=int(x); return(x>y?y+1:y)}
$ awk -v numCols=2 -f tst.awk file
1,4
2,5
3,6
$ awk -v numCols=3 -f tst.awk file
1,3,5
2,4,6
Обратите внимание, что вышеприведенное будет работать, даже если ваше количество входных строк не является точным кратным числу столбцов, которые вы хотите (обратите внимание, что есть 3 поля, разделенные запятыми, даже в строках с пустыми полями):
$ seq 10 | awk -v numCols=3 -f tst.awk
1,5,9
2,6,10
3,7,
4,8,
См. https://stackoverflow.com/a/56725768/1745001 о том, как сделать обратное, то есть сгенерировать количество столбцов с заданным количеством строк.