如何添加2列(测试1和测试2)并根据列标题名称将结果打印在第四列中? (CSV文件)-逗号分隔的文件
输入:
class Base:
@staticmethod
def init_subclass(cls):
required_class_variables = ["a", "b"]
for required_class_variable in required_class_variables:
if not hasattr(cls, required_class_variable):
raise ValueError(
f"{cls} lacks required class variable"
f"{required_class_variable}!"
)
class A(Base):
def __init_subclass__(cls):
Base.init_subclass(cls)
class B(Base):
def __init_subclass__(cls):
Base.init_subclass(cls)
输出:
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
答案 0 :(得分:0)
样本输入:
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}
一样。
答案 1 :(得分:0)
处理此问题的最佳方法是创建一个数组,该数组在读取标题行时将列标题字符串(即字段名称)映射到字段编号,然后从此开始按字段名称访问这些字段:< / p>
$ 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