Linux 如何基于一个匹配列合并具有不同字段的两个文件?

Linux 如何基于一个匹配列合并具有不同字段的两个文件?,linux,awk,Linux,Awk,我有两个文件,如下所示,我想根据通用ID将它们合并为一个文件: 文件1: ARS 8.0 8.0 BBL 1.1 1.2 CCL 1.9 1.8 文件2: ARS 2.3 2.4 ARS 2.6 2.4 ARS 2.5 2.3 BBL 1.9 1.8 EDE 1.4 1.6 期望输出: ARS 8.0 8.0 ARS 2.3 2.4 ARS 8.0 8.0

我有两个文件,如下所示,我想根据通用ID将它们合并为一个文件:

文件1:

ARS     8.0   8.0
BBL     1.1   1.2
CCL     1.9   1.8
文件2:

ARS     2.3   2.4
ARS     2.6   2.4
ARS     2.5   2.3
BBL     1.9   1.8
EDE     1.4   1.6
期望输出:

ARS     8.0   8.0    ARS     2.3   2.4
ARS     8.0   8.0    ARS     2.6   2.4   
ARS     8.0   8.0    ARS     2.5   2.3
BBL     1.1   1.2    BBL     1.9   1.8
CCL     1.9   1.8    NA
NA                   EDE     1.4   1.6

请您尝试下面的内容,并让我知道这是否对您有帮助。(我最后遵守了NA的命令,只让我知道这是否对您有帮助)。 在这里也添加了一个非线性形式的解决方案

awk '
FNR==NR{
  a[$1]=$0;
  next
}
($1 in a){
  print a[$1],$0;
  b[$1];
  next
}
{
  print "NA\t",$0       
}
END{
  for(i in b){
    delete a[i]
};
  for(j in a){
  print a[j],"\tNA"
}
}
' file1  file2
输出如下

ARS     8.0   8.0 ARS     2.3   2.4
ARS     8.0   8.0 ARS     2.6   2.4
ARS     8.0   8.0 ARS     2.5   2.3
BBL     1.1   1.2 BBL     1.9   1.8
NA   EDE     1.4   1.6
CCL     1.9   1.8   NA


可以通过多种方式对其进行优化,以避免将两个文件的全部内容存储在数组中,但我喜欢上面的简单性和对称性,如果由于大量的输入文件而需要进行优化,那么以后再进行优化就很简单了。

有一个用于合并文件的工具

join -a 1 -a 2 -e NA t24.in1 t24.in2  -o 1.1,1.2,1.3,2.1,2.2,2.3
输出:

ARS     8.0     8.0     ARS     2.3     2.4
ARS     8.0     8.0     ARS     2.6     2.4
ARS     8.0     8.0     ARS     2.5     2.3
BBL     1.1     1.2     BBL     1.9     1.8
CCL     1.9     1.8     NA      NA      NA
NA      NA      NA      EDE     1.4     1.6

这些字段是以制表符分隔的还是固定宽度的,或者是一些空白字符或其他什么?它们可能都是以制表符分隔的。例如,
ARS
,可以像在文件2中一样在文件1中多次出现吗?如果是这样的话,在你的示例中包括一个这样的例子。JNevil,这是不同的Hanks RavinderSingh第二个有效,但我希望右列中的NA能够识别它属于哪个文件,比如说,如果ID仅来自文件1,NA应该出现在输出的右侧。(看看我的问题)。此处,对于CCL,EDE应显示在右侧,NA应显示在左侧和对面。@Behmah,现在请检查我编辑的解决方案并让我知道。它没有更改:(当我运行我的代码时,我得到的输出与我在帖子中提到的相同,让我知道你是否运行完全相同的代码?我很抱歉,我真的忽略了它,我现在用输出编辑了我的代码(特别是NA的位置)
^1
喜欢你使用的方式
gsub
join -a 1 -a 2 -e NA t24.in1 t24.in2  -o 1.1,1.2,1.3,2.1,2.2,2.3
ARS     8.0     8.0     ARS     2.3     2.4
ARS     8.0     8.0     ARS     2.6     2.4
ARS     8.0     8.0     ARS     2.5     2.3
BBL     1.1     1.2     BBL     1.9     1.8
CCL     1.9     1.8     NA      NA      NA
NA      NA      NA      EDE     1.4     1.6