이 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

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

관련 정보