如何基于标题名称添加两列并将结果粘贴到基于标题名称的第三行中?

时间:2019-05-03 19:08:11

标签: linux unix awk

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

2 个答案:

答案 0 :(得分:0)

样本输入:

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}一样。

答案 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