如何通过引用另一列中的匹配值来添加两个不同文件中的两个列?

时间:2019-03-05 11:54:37

标签: bash awk

文件1:

1  0.3
2  0.1
3  0.4
4  0.8

文件2:

2  0.7
4  0.2
6  0.5
8  0.9

检查文件1和文件2中的字段1,我们看到字符串2和4是相同的。这些是我的参考行。对于这些参考行,我想在两个文件中添加字段2中的值。

换句话说

  • 在文件1和文件2中搜索匹配$ 1中的字符串。在这种情况下,为2和4。

  • 为$ 1 = 2,则$ 2 = 0.1 + 0.7 = 0.8

  • $ 1 = 4,则$ 2 = 0.8 + 0.2 = 1.0

文件3中所需的输出:

1 0.3
2 0.8
3 0.4
4 1.0

即,文件3 =文件1,但行2中文件1中的$ 1与文件2中的$ 1匹配的行除外。

摘要

我想要一个脚本,该脚本可以在两个文件之间的$ 1中搜索匹配项,然后在找到$ 1匹配项的地方打印$ 2(文件1)+ $ 2(文件2)。输出为文件3,无论发生什么匹配,该文件都会用新的总和值打印文件1。非常感谢您的协助!

2 个答案:

答案 0 :(得分:3)

请尝试以下操作(如果您对Set(roadidx_995, roadidx_996) Set(roadidx_998, roadidx_997) Set(roadidx_999) 没问题)。

awk

如果要在输出中使用浮点数直到1点以及正确的制表符格式,请尝试执行以下操作。

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

或者按照Ed ir先生的评论,我们不需要检查awk 'FNR==NR{a[$1]=$2;next} $1 in a{$2=sprintf("%.01f",$2+a[$1])} 1' Input_file2 Input_file1 | column -t ,因此可以将其从代码中删除。

$1 in a

答案 1 :(得分:0)

使用流水线awk

$ awk ' $(NF+1)=FILENAME ' blaisem2.txt blaisem1.txt | 
        awk ' { a[$1]+=$2; $2=sprintf("%.01f",a[$1]); print } ' | 
             awk ' /blaisem1.txt/ && NF-- '
1 0.3
2 0.8
3 0.4
4 1.0

$

文件所在的位置

$ cat blaisem1.txt
1  0.3
2  0.1
3  0.4
4  0.8

$ cat blaisem2.txt
2  0.7
4  0.2
6  0.5
8  0.9

$

它可以进一步缩短2周,为

$ awk ' $(NF+1)=FILENAME ' blaisem2.txt blaisem1.txt | 
    awk ' { a[$1]+=$2; $2=sprintf("%.01f",a[$1]); } /blaisem1.txt/ { NF--; print } '
1 0.3
2 0.8
3 0.4
4 1.0

$