Как добавить два столбца на основе имени заголовка и вставить результаты в третью строку на основе имени заголовка? - PullRequest
0 голосов
/ 03 мая 2019

Как я могу добавить 2 столбца (тест 1 и тест 2) и распечатать результат в четвертом столбце на основе имен заголовков столбцов?(CSV-файл) - файл с запятой

Ввод:

test1 test2 test3 test4
1 2 x 
2 4 Y 

Ввод:

test1 test2 test3 test4
1 2 x 3
2 4 Y 6

Я попробовал нижеприведенное, но оно работает на основезаголовки столбцов, а не позиции.

awk -F, '{$3=$1+$2;} {print $1,$2,$3}' OFS=, testing.csv

awk -F, '{$3=$1+$2;} {print $1,$2,$3}' OFS=, testing.csv

Ввод:

test1 test2 test3 test4
1 2 x 
2 4 Y 

Ввод:

test1 test2 test3 test4 
1 2 x 3
2 4 Y 6

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

Лучший способ справиться с этим - создать массив, который отображает строки заголовка столбца (т.е. имена полей) на номера полей при чтении строки заголовка, а затем просто получает доступ к полям по их именам с этого момента:

$ 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
0 голосов
/ 03 мая 2019

Пример ввода:

cat inputfile
test1 test2 test3 test4
1 2 x
2 4 Y

Здесь из первой строки прочитайте заголовок и получите номер столбца test1 и test2 и сохраните его в переменных t1 и t2, а затем переназначьте $4 с самим собой и сумма столбца, указанная t1 и t2.

awk 'NR==1{for(i=1;i<=NF;i++) if($i=="test1") t1=i; else if($i=="test2") t2=i} NR>1{$4=$4 FS $t1+$t2} {print }' inputfile
test1 test2 test3 test4
1 2 x  3
2 4 Y  6

Если у вас есть пустые строки во входном файле и вы хотите сохранить их, тогда используйте NF в качестве ненулевого значения, например NR>1&& NF{$4=$4 FS $t1+$t2}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...