목표: 파일에 있는 공개 키를 사용하여 두 파일의 내용을 병합합니다.
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
시도된 방법:
join
주문하다:join -a 1 -a 2 file1.txt file2.txt ## full outer join
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
index 를 사용하여 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