为什么这个 awk 命令不执行完整的外连接?

为什么这个 awk 命令不执行完整的外连接?

目标:使用文件中存在的公用密钥合并两个文件的内容

 file1.txt
 =========
 key1   11
 key2   12
 key3   13


 file2.txt
 =========
 key2   22
 key3   23
 key4   24
 key5   25


 Expected Output :
 ==================
 key1   11
 key2   12    22
 key3   13    23 
 key4   24
 key5   25

尝试过的方法:

  1. join命令:

    join -a 1 -a 2 file1.txt file2.txt ## full outer join
    
  2. awk:

    awk 'FNR==NR{a[$1]=$2;next;}{ print $0, a[$1]}' 2.txt 1.txt
    

方法 2 产生右外连接而不是完整外连接:

   key1  11
   key2  12    22
   key3  13    23 

方法 2 中需要修改哪些内容才能产生完全外连接?

答案1

我的解决方案使用join

join -a1 -a2  -1 1 -2 1 -o 0,1.2,2.2 -e "NULL" file1 file2 

awk我对加入大文件不太了解,并且总是使用join.

key1 11 NULL
key2 12 22
key3 13 23
key4 NULL 24
key5 NULL 25

答案2

我的解决方案是awk:

awk '{a[$1]=a[$1]" "$2} END{for(i in a)print i, a[i]}' file1.txt file2.txt

使用keyn作为索引,将second fields每行中的 附加到相应的行 a[keyn](使用space)。最后,打印所有indicesarray element

输出:

AMD$ awk '{a[$1]=a[$1]" "$2} END{for(i in a)print i, a[i]}' file1.txt file2.txt
key1  11
key2  12 22
key3  13 23
key4  24
key5  25

答案3

awk,尝试:

awk '{a[$1]=($1 in a)?a[$1]" "$2:$2};END{for(i in a)print i,a[i]}' file1 file2

对于大文件,您应该使用join而不是awk方法,因为awk方法会在打印之前将所有文件内容存储在内存中。

答案4

你的第一个join在这里似乎没问题,尽管大写字母拼写错误:

$>join -a 1 -a 2 file1.txt file2.txt 
key1 11
key2 12 22
key3 13 23
key4 24
key5 25

相关内容