如何根据标题名称添加两列并根据标题名称将结果粘贴到第三行?



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

解决此问题的最佳方法是创建一个数组,该数组在读取标题行时将列标题字符串(即字段名称)映射到字段编号,然后从那时起只需按字段名称访问字段:

$ 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 的列号并将其存储到变量t1t2中,然后用自身和t1t2指向的列之和重新分配$4

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}.

最新更新