AWK 두 파일의 열 1을 비교하여 출력의 세 번째 열에 추가 열을 인쇄합니다.

AWK 두 파일의 열 1을 비교하여 출력의 세 번째 열에 추가 열을 인쇄합니다.

동일한 형식의 두 입력 파일의 첫 번째 열을 비교하려고 합니다. 형식은 다음과 같습니다.

FILE1:
0000abc5abc3 GR096
0000def5ae87 GR001
0000cab5aea3 GR001
0000bac5aeeb GR001
0000fed5af13 GR001
0000efd5b16f GR001
0000cba5b187 GR001
0000bca5b2a3 GR001

FILE2:
0000abc5abc3 GR097
0000def5ae87 GR001
0000cab5aea3 GR001
0000bac5aeeb GR001
0000fed5af13 GR123
0000cba5b187 GR169

열 1에는 FILE1 및 FILE2의 MAC 주소가 포함됩니다. FILE1의 1열 값을 FILE2의 1열과 비교하여 일치하는 항목이 있으면 FILE1의 1열과 2열의 값과 FILE2의 2열의 값이 3개의 열로 출력되도록 하고 싶습니다.

DESIRED OUTPUT:
0000abc5abc3 GR096 GR097
0000def5ae87 GR001 GR001
0000cba5b187 GR001 GR169

각 파일에는 수백만 개의 항목이 포함되어 있습니다. while 루프를 사용하여 bash에서 입력을 실행하는 것은 각 항목을 반복하기 때문에 항상 느리고 비효율적입니다.

while read -r mac1 code1; do
    while read -r mac2 code2 ; do
        if [ "$mac1" == "$mac2" ]; then
            printf "%s %s %s\n" "$mac1" "$code1" "$code2"
        fi
    done < "$FILE1"
done < "$FILE2" > OUTPUTFILE

배열을 사용하면 Awk가 훨씬 빠르지만 다음 구문을 사용하면 FILE2의 두 번째 열을 출력의 세 번째 열에 인쇄할 수 없습니다. 이 구문은 열 2만 두 번째로 인쇄합니다.

awk 'NR==FNR { n[$1] = $1; n[$2] = $2; next } ($1 in n) { print n[$1],n[$2],$2 }'

나는 AWK를 선호하지만 bash에서 그만큼 빠르게 실행된다면 괜찮을 것입니다.

요약: file1의 1열 값이 file2에서 발견되면 1열, 2열(파일 1), 2열(파일 2)의 값을 출력합니다.

답변1

출력을 정렬할 수 있는 경우:

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

답변2

awk를 수정하려면 다음을 수행하십시오.

awk 'NR==FNR { n[$1]=$0;next } ($1 in n) { print n[$1],$2 }' file1 file2

#Output:
0000abc5abc3 GR096 GR097 
0000def5ae87 GR001 GR001 
0000cab5aea3 GR001 GR001 
0000bac5aeeb GR001 GR001 
0000fed5af13 GR001 GR123 
0000cba5b187 GR001 GR169 

답변3

join이를 수행하는 데 적합한 도구는 다음과 같습니다.

join <(sort file1) <(sort file2)

정렬된 파일에서 작동하기 때문에 bash의 프로세스 대체( <(...))를 사용하여 각 파일을 join.

관련 정보