Awk减法记录

Awk减法记录,awk,Awk,我的数据集如下所示,但要大得多: 5 6 9 2 4 6 4 5 1 我希望能够从当前记录中减去每个记录中的每个字段,然后将它们相加并存储结果。例如,这里我想从第一行(5-2)+(6-4)+(9-6)=结果开始。还有(5-4)+(6-5)和(9-1)。对所有其他行也要这样做,例如第二行(2-4)+(4-5)+(6-1)和(2-5)+(4-6)+(6-9)等。我可以按如下方式手动执行此操作: { if (max_nf < NF) max_nf = NF

我的数据集如下所示,但要大得多:

5 6 9
2 4 6
4 5 1
我希望能够从当前记录中减去每个记录中的每个字段,然后将它们相加并存储结果。例如,这里我想从第一行(5-2)+(6-4)+(9-6)=结果开始。还有(5-4)+(6-5)和(9-1)。对所有其他行也要这样做,例如第二行(2-4)+(4-5)+(6-1)和(2-5)+(4-6)+(6-9)等。我可以按如下方式手动执行此操作:

{
     if (max_nf < NF)
          max_nf = NF
     max_nr = NR
     for (x = 1; x <= NF; x++)
          vector[x, NR] = $x
}

END { result = ((vector[1,1] - vector[1,2]) + (vector[2,1] - vector[2,2]) + (vector[3,1] - vector[3,2]))
}
{
如果(最大值对于(x=1;x来说,一个明显的可能性是如下顺序:

BEGIN { getline; fields = NF+1; for (i=1; i<fields; i++) first[i] = $i; }

    { 
      total = 0;
      for (field = 1; field < fields; field++)  
          total += first[field] - $field;
      printf("%d\n", total);
    }

BEGIN{getline;fields=NF+1;for(i=1;i注意,只使用记录的总和。因此,您可以将任务简化为两个步骤:

  • 找到每个记录的总数
  • 计算总数的差异
  • 这可能看起来像:

    cat data | # generate the data in whatever fashion
      awk '{ for (n=1; n<=NF; n++) 
               recsum[NR]+=$n
           } 
           END { 
             for (n=1; n<=NR; n++) 
               for (m=n+1; m<=NR; m++) 
                 print n, m, recsum[n]-recsum[m] }'
    

    我该如何修改它,以便它在下一行中也会这样做?您想对结果做什么?打印出所有的值?
    cat data | # generate the data in whatever fashion
      awk '{ for (n=1; n<=NF; n++) 
               recsum[NR]+=$n
           } 
           END { 
             for (n=1; n<=NR; n++) 
               for (m=n+1; m<=NR; m++) 
                 print n, m, recsum[n]-recsum[m] }'
    
    1 2 8
    1 3 10
    2 3 2