如何添加2列(测试1和测试2),并基于列标题名称的第四列打印出结果? (CSV文件) - 逗号demilited文件
输入:
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
对付它的最好方法是创建一个读取头线的时候,然后就用自己的名字从此进入字段列标题字符串(即字段名)映射到数字领域的数组:
$ 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
样品输入:
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}
文章来源: How to add two columns based on header names and paste results in a third row based on header name?