【问题标题】:Matrix addition over multiple files using e.g. awk使用例如在多个文件上添加矩阵awk
【发布时间】:2014-06-17 18:43:47
【问题描述】:

我有一堆来自模拟输出的文件,所有文件的行数和字段数都相同。 我需要做的就是将它们组合起来,这样我就只得到一个数字相加的文件,这基本上类似于几个矩阵相加。

例子:

文件1.txt

1 1 1
1 1 1
1 1 1

文件2.txt

2 2 2
2 2 2
2 2 2

文件3.txt

3 3 3
3 3 3 
3 3 3 

需要的输出

6 6 6
6 6 6
6 6 6

我将把它集成到一些更大的 Shell 脚本中,因此我更喜欢 awk 中的解决方案,但也欢迎使用其他语言。

【问题讨论】:

    标签: matrix awk


    【解决方案1】:
    awk '{for(i=1;i<=NF;i++)a[FNR,i]=$i+a[FNR,i]}
    END{for(i=1;i<=FNR;i++)
          for(j=1;j<=NF;j++)printf "%s%s", a[i,j],(j==NF?"\n":FS)}' f1 f2 f3
    

    输入文件可能超过 3 个

    用你的数据测试:

    kent$  head f[1-3]
    ==> f1 <==
    1 1 1
    1 1 1
    1 1 1
    
    ==> f2 <==
    2 2 2
    2 2 2
    2 2 2
    
    ==> f3 <==
    3 3 3
    3 3 3
    3 3 3
    
    kent$  awk '{for(i=1;i<=NF;i++)a[FNR,i]=$i+a[FNR,i]}END{for(i=1;i<=FNR;i++)for(j=1;j<=NF;j++)printf "%s%s", a[i,j],(j==NF?"\n":FS)}' f1 f2 f3
    6 6 6
    6 6 6
    6 6 6
    

    【讨论】:

    • 见鬼,这太快了!完美运行,非常感谢。
    【解决方案2】:

    快速破解:

    paste f1 f2 f3 | awk '{for(i=1;i<=m;i++)printf "%d%s",$i+$(i+m)+$(i+2*m),i==m?ORS:OFS}' m=3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-28
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      相关资源
      最近更新 更多