Нет необходимости в цикле bash, вызывающем awk несколько раз, просто цикл в 1 вызове awk, например, с GNU awk, который автоматически обрабатывает потенциальную проблему «слишком много открытых файлов»:
awk '{
for (i=1; i<=21; i++) {
print $(i+2) > ("col"i".csv")
}
}' z.csv
и с любым awk:
awk '{
for (i=1; i<=21; i++) {
close(out)
out = "col"i".csv"
print $(i+2) >> out
}
}' z.csv
Если закрытие всех файлов на каждой итерации вызывает проблемы с производительностью, и вы обнаружите, что вы можете, скажем, 11 выходных файлов открывать одновременно, не получая «слишком много открытых»файлы "ошибка, то вы можете сделать что-то вроде этого:
awk '{
for (i=1; i<=21; i++) {
if (i>11) close(out)
out = "col"i".csv"
print $(i+2) >> out
}
}' z.csv
или чуть более эффективно, но с немного большим кодом:
awk '{
for (i=1; i<=10; i++) {
print $(i+2) > ("col"i".csv")
}
for (; i<=21; i++) {
close(out)
out = "col"i".csv"
print $(i+2) >> out
}
}' z.csv