【问题标题】:Awk subtract many columns between two filesawk 减去两个文件之间的许多列
【发布时间】:2018-07-13 03:51:25
【问题描述】:

如果我有两个文件,每个文件有 4 列数据,并且我想减去这些文件之间的列,我会执行以下操作:

paste data1.txt data2.txt | awk '{ printf("%s %d %d %d\n", $1, ($2-$6), ($3-$7), ($4-$8); }' > out.txt

如果我的文件每个有 100 列,并且我想在两个文件之间减去列而不写这么多 ($i-$j)、($k-$l) 等,我应该如何做类似的事情。

谢谢。

【问题讨论】:

    标签: awk


    【解决方案1】:

    使用循环。你需要传入列数

    awk -v cols=100 '{ 
        printf "%s", $1
        for (i=2; i <= cols; i++)
            printf "%s%d", OFS, $i - $(cols+i)
        printf "\n"
    }'
    

    【讨论】:

      【解决方案2】:

      awk 来救援!

      假设您的 file1 比 file2 多一列,并且您正在区分 file1 和 file2 中的相应列

      $ paste file1 file2 | 
        awk '{n=int(NF/2); printf "%s", $1; 
              for(i=2;i<=n+1;i++) printf "%d" ,OFS ($i-$(i+n)); printf "\n"}'
      

      它还隐含地假设字段总数是奇数。

      带有虚拟数据

      创建100列文件;将行标题附加到其中之一。由于数据部分相等,因此所有差异都应为零。

      $ seq 200 | xargs -n 100 > file2
      $ paste <(echo -e "row1\nrow2") file2 > file1
      
      $ paste file1 file2 | awk ...
      
      row1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
      row2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
      

      【讨论】:

        【解决方案3】:

        使用getline;大致基于我找到的答案here

        awk '{split($0,a);getline<"file2";for(i=1;i<=NF;i++)$i=a[i]-$i;}1' file1
        

        示例:

        文件1:

        31 33 35 37
        51 53 55 57
        

        文件2:

        21 22 23 24
        31 32 33 34
        

        输出:

        10 11 12 13
        20 21 22 23
        

        【讨论】:

        • for(i=1;i&lt;=NF;i++)a[i]=$i 可以替换为split($0,a)
        • @karakfa 谢谢,我不知道!我相应地调整了答案。
        猜你喜欢
        • 2013-02-09
        • 2010-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-06
        • 1970-01-01
        • 2016-12-09
        相关资源
        最近更新 更多