linux - 如何在 BASH 中将两个表相乘

标签 linux bash shell awk

我有两个这样的数据文件:

文件1:

  a1    a2  a3  ... aN
  b1    b2  b3  ... bN
  .
  .
  .

文件1:

  A1    A2  A3  ... AN
  B1    B2  B3  ... BN
  .
  .
  .

我想将两个表相乘,即

  a1*A1 a2*A2   a3*A3   ... aN*AN
  b1*B1 b2*B2   b3*B3   ... bN*BN
  .
  .
  .

我可以用 AWK 或 BASH 中的其他东西来做吗?非常感谢!

最佳答案

这是使用 GNU awk 的一种方法,假设您在每个文件中具有相同数量的字段和行。像这样运行:

awk -f script.awk file1 file2

script.awk 的内容:

FNR==NR {
    for (i=1;i<=NF;i++) {
        a[NR][i]=$i
    }
    next
}

{
    for (j=1;j<=NF;j++) {
        $j = $j * a[FNR][j]
    }
}1

或者,这是一个衬垫:

awk 'FNR==NR { for(i=1;i<=NF;i++) a[NR][i]=$i; next } { for(j=1;j<=NF;j++) $j = $j * a[FNR][j] }1' file1 file2

测试:

file1 的内容:

1 2 3   
2 4 6

file2 的内容:

3 4 5
6 7 8

结果:

3 8 15
12 28 48

编辑:

如果,我的意思是如果,可能有一个文件具有而另一个文件没有的额外字段,请更改:

$j = $j * a[FNR][j]

到:

$j = (a[FNR][j] ? $j * a[FNR][j] : $j)

这将打印现有值而不是零。 HTH.

关于linux - 如何在 BASH 中将两个表相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14929198/

相关文章:

linux - 不同 shell 的分布

linux - 从不断更新的目录中读取更新

linux - Shell:如果 a 小于 b, "a -lt b"是否不表示为真?

bash - 为什么在 dockerfile run 指令的/bin/bash -c "..."部分中的 echo $VARIABLE 在 docker build 上返回空值?

linux - 如何让 Bash 自动将每个命令的输出传输到 tee 之类的东西?

c++ - 在 Qt 5.0.2 (Linux) 中使用 QCamera 无法获取相机支持的图像捕获分辨率

linux - 读取子文件夹中的特定行并计算平均值

Bash Shell 参数扩展 ${ }

linux - 我怎样才能在一个系统上找到一个 Unix 程序的所有版本?

bash - BASH 中可以根据另一个变量的内容调用变量吗?