如何参考另一个列中的匹配值从三个不同的文件中添加两个列?

时间:2019-03-05 15:56:34

标签: bash

文件1:

1  0.3
2  0.1
3  0.4
4  0.8

文件a:

2  0.7
4  0.2
6  0.5
8  0.9

文件b:

2 0.4
6 0.6

目标

分步操作:

  1. 在文件1,a和b之间的字段1($ 1)中查找公用值。作为上述文件的示例解决方案:
    • 文件1,文件a和文件b在$ 1 = 2中都有一个公共值。
    • 文件1和文件a在$ 1 = 4中也具有相同的值
  2. 输出文件1,进行以下更改:
    • 对于$ 1 = 2,则$ 2 = 0.1 + 0.7 + 0.4 = 1.2
    • 对于$ 1 = 4,则$ 2 = 0.8 + 0.2 = 1.0

文件2中所需的输出:

1 0.3
2 1.2
3 0.4
4 1.0

即,文件2 =文件1,但行2中文件1中的$ 1与文件a或b中的$ 1相匹配的行除外。

类似问题

我已经收到有关此问题的advice,用于使用代码

匹配并添加两个文件

 awk 'FNR==NR{a[$1]=$2;next} {$2=$1 in a?$2+a[$1]:$2} 1' Input_file2  Input_file1 >> output_file

但是,该代码不能同时处理3个输入文件。如果我分别进行处理(一次两个文件,即文件1 +文件a,然后是文件1 +文件b),我最终将文件1的值加两次。

由于我可能要比较3-6个文件,因此我不能简单地执行File a + File b >> File c,然后是File 1 + File c >> File 2。

摘要

我想要一个脚本,该脚本可以在三个文件之间的$ 1中搜索匹配项,然后在找到$ 1匹配项的地方打印$ 2(文件1)+ $ 2(文件a和/或文件b)。输出为文件2,无论在$ 1中发生了什么匹配,它都将在$ 2中打印具有新的总和的文件1。非常感谢您的协助!

1 个答案:

答案 0 :(得分:1)

这里合一:

$ awk '
NR==FNR {             # store the file1 to a hash and add to its elements
    a[$1]=$2
    next
}
($1 in a) {
    a[$1]+=$2
}
END {
    for(i in a)
        print i,a[i]  # print in no particular order
}' file1 filea fileb

输出:

1 0.3
2 1.2
3 0.4
4 1