この awk コマンドが完全な外部結合を実行しないのはなぜですか?

この awk コマンドが完全な外部結合を実行しないのはなぜですか?

目的:ファイル内の公開鍵を使用して2つのファイルの内容をマージします。

 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

keynindexを使用してsecond fields各行をその行に追加します a[keyn](を使用)space。最後に、すべてのindices合計を印刷しますarray 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

関連情報