awk/shell에서 동일한 레코드를 가진 2개의 파일을 한 줄씩 병합하는 방법은 무엇입니까?

awk/shell에서 동일한 레코드를 가진 2개의 파일을 한 줄씩 병합하는 방법은 무엇입니까?

저는 awk와 shell을 처음 접했고 shell/awk를 사용하여 두 파일을 동일한 레코드가 있는 줄로 병합하는 방법을 알고 싶습니다. file1과 file2의 이름 순서는 다를 수 있습니다. 동일한 레코드가 있는 행만 병합하고 싶습니다. 도와주세요.

file1.txt
Mary 68 
Tom 50 
Jason 45
Lu 66

file2.txt
Jason 37
Tom 26
Mary 74
Tina 80

mergefile.txt
Marry 68 74
Tom 50 26
Jason 45 37 

awk를 시도했지만 스크립트를 실행하는 데 시간이 좀 걸립니다. 더 빠르고 쉬운 도구가 있는지 궁금합니다.

cat file1.txt | while read line
do
    score1=$( echo $line | awk '{print $2}');
    name1=$( echo $line | awk '{print $1}');

    cat file2.txt | while read l
    do
        score2=$( echo $l | awk '{print $2}');
        name2=$( echo $l | awk '{print $1}');
        if [[ $name1 == $name2 ]]
        then
            echo "$name1 $score1 $score2" >> mergefile
            break
        fi
    done
done

답변1

awk를 사용하려면:

$ awk 'NR==FNR {a[$1] = $2; next} $1 in a {print $1, $2, a[$1]}' file2.txt file1.txt 
Mary 68 74
Tom 50 26
Jason 45 37

정렬은 필요하지 않으며 두 번째 파일에 지정된 순서대로 출력됩니다.

설명하다:

  • NR==FNR첫 번째 명명된 파일에서 레코드를 선택하는 정식 방법입니다.
  • {a[$1] = $2; next}첫 번째 필드의 키와 두 번째 필드의 값으로 배열을 채웁니다.
  • $1 in a첫 번째 필드가 첫 번째 파일에 이미 표시되어 있는 경우;
  • {print $1, $2, a[$1]}두 번째 파일의 키와 값, 첫 번째 파일의 값을 인쇄합니다.

답변2

이건 직업인 것 같아join, 관계형 데이터베이스 운영자

join <(sort file1.txt) <(sort file2.txt)

시험

$ cat file1.txt
Mary 68
Tom 50
Jason 45
Lu 66

$ cat file2.txt
Jason 37
Tom 26
Mary 74
Tina 80

$ join <(sort file1.txt) <(sort file2.txt)
Jason 45 37
Mary 68 74
Tom 50 26

joinPOSIX에 명시된 표준 도구입니다.

매뉴얼 join페이지에는 다음과 같이 명시되어 있습니다.

The files file1 and file2 shall be ordered in the collating sequence of sort -b on the 
fields on which they shall be joined, by default the first in each line. All selected 
output shall be written in the same collating sequence.

관련 정보