基于公共第一列合并两个双列文件,优先选择给定文件第二列中的值

基于公共第一列合并两个双列文件,优先选择给定文件第二列中的值

我有两个文本文件1.txt2.txt其中包含两个制表符分隔的列。两个文件的第一列均由标记化文本组成。在这两个文件中,第一列是相同的。词序很重要。第二列由标签组成。在第一个文件中,标记化是完整的但不精确。在第二个文件中,它不完整但准确。

1.txt:

I          3
was        5
there      6
yesterday  6
.          0

2.txt:

I          3
was        
there      12
yesterday  
.          0

我想合并这两个文件(同时保持行的顺序),以便每行都有一个标签,因此更精确的(即 file 中的标签2.txt)是首选,如下所示:

I          3
was        5
there      12
yesterday  6
.          0

我尝试过使用join,但它只能显示两个标签或仅显示一个文件中的标签:

$ join 1.txt 2.txt 
I          3 3
was        5 
there      6 12
yesterday  6 
.          0 0
$ join -1 1 -2 1 -o 1.1,2.2 1.txt 2.txt
I          3
was        
there      12
yesterday  
.          0

这个答案使用awk看起来很接近,但没有提供预期的结果。我也更喜欢使用 coreutils。

答案1

使用awk

awk 'NR==FNR{if (NF==2) a[$1]=$2; next}
     {print $1,($1 in a ? a[$1] : $2)}' 2.txt 1.txt
  • NR==FNR如果编号记录等于文件编号记录(如果在第一个文件中)
  • a[$1]=$2使用第一个字段作为键将第二个字段存储到数组中
  • $1 in a ? a[$1] : $2if是print$1中的一个键else printaa[$1]$2

答案2

这是另一种选择:

join 1.txt 2.txt | awk -e '{if($NF == "") print $1, $(NF - 1); else print $1, $NF}' | column -t

这使:

I          3
was        5
there      12
yesterday  6
.          0

| column -t是可选的,但只需将其格式化为漂亮的列即可。

相关内容