如何添加 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 的列号并将其存储到变量t1
和t2
中,然后用自身和t1
和t2
指向的列之和重新分配$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}
.