首页 > 解决方案 > 如何参考另一列中的匹配值从三个不同文件中添加两列?

问题描述

文件 1:

1  0.3
2  0.1
3  0.4
4  0.8

文件一:

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,除了文件 1 中的 $1 与文件 a 或 b 中的 $1 匹配的行之外,已在 $2 中添加在一起。

类似的问题

我已经收到了关于这个问题的建议,使用代码匹配和添加两个文件

 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 个文件要比较,所以我不能简单地执行文件 a + 文件 b >> 文件 c,然后是文件 1 + 文件 c >> 文件 2。

概括

我想要一个脚本,可以在三个文件之间搜索 $1 中的匹配项,然后在找到 $1 匹配项的任何地方打印 $2(文件 1)+ $2(文件 a 和/或文件 b)。输出是文件 2,它打印文件 1,其中包含 $2 中的新总和值,只要出现 $1 中的匹配项。非常感谢任何帮助!

标签: bash

解决方案


这里合而为一:

$ 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

推荐阅读