如何添加基于标题名称和粘贴结果两列的基础上头名第三排?(How to add two columns

2019-10-29 23:53发布

如何添加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

Answer 1:

对付它的最好方法是创建一个读取头线的时候,然后就用自己的名字从此进入字段列标题字符串(即字段名)映射到数字领域的数组:

$ 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


Answer 2:

样品输入:

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

在这里,从第一行读头,并得到TEST1和TEST2的列数,并将其存储到变量t1t2 ,并重新分配$4与自身和列的总和指出t1t2

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?
标签: linux unix awk