Лучший способ справиться с этим - создать массив, который отображает строки заголовка столбца (т.е. имена полей) на номера полей при чтении строки заголовка, а затем просто получает доступ к полям по их именам с этого момента:
$ awk '
NR==1 { for (i=1;i<=NF;i++) f[$i]=i }
NR>1 { $(f["test4"]) = $(f["test1"]) + $(f["test2"]) }
1' file
test1 test2 test3 test4
1 2 x 3
2 4 Y 6
Выше я предположил, что на самом деле у вас нет пустых строк между строками данных при вводе.Тривиально обрабатывается, если вы делаете.
Если ваш ввод / вывод действительно CSV, тогда просто создайте раздел BEGIN, объявляющий, что:
$ cat file
test1,test2,test3,test4
1,2,x,
2,4,Y
$ awk 'BEGIN{FS=OFS=","} NR==1{for (i=1;i<=NF;i++) f[$i]=i} NR>1{$(f["test4"]) = $(f["test1"]) + $(f["test2"])} 1' file
test1,test2,test3,test4
1,2,x,3
2,4,Y,6