AWK를 사용하여 두 개의 CSV 파일을 하나로 결합

AWK를 사용하여 두 개의 CSV 파일을 하나로 결합

AWK를 사용하여 두 개의 CSV 파일을 병합하려고 합니다. file1의 첫 번째 열이 file2의 첫 번째 열과 일치하면 file1의 세 번째 열을 file2의 두 번째 열 값으로 변경하고 싶습니다. 일치하는 항목이 없으면 변경하지 않고 다음 행으로 이동합니다.

파일 1.csv

alice,soccer,24
bob,baseball,21
jessica,swimming,22
mike,running,20

파일 2.csv

alice,5
jessica,9

원하는 출력:

alice,soccer,5
bob,baseball,21
jessica,swimming,9
mike,running,20

지금까지 내 코드는 다음과 같습니다.

#!/bin/bash

    awk -F"," 'BEGIN{OFS=","}
        { if (NR==NFR){ 
         array[$1]=$1; 
        } 
        if ( $1 in array ){
         $3=array[$2]
        }
         print
        }' file2.csv file1.csv

답변1

노력하다:

$ awk -F, 'FNR==NR{a[$1]=$2;next} $1 in a{$3=a[$1]} 1' OFS=, file2.csv file1.csv
alice,soccer,5
bob,baseball,21
jessica,swimming,9
mike,running,20

어떻게 작동하나요?

  • -F,

    그러면 입력 필드 구분 기호가 쉼표로 설정됩니다.

  • FNR==NR{a[$1]=$2;next}

    읽으면 file2.csv배열의 첫 번째 필드 키 아래에 두 번째 필드가 저장됩니다 a.

    의 사용에 유의하세요 next. 이는 awk에게 나머지 명령을 건너뛰고 다음 줄에서 시작하도록 지시합니다.

    예를 들어, 을 읽은 후 file2.csv배열의 내용은 및 a입니다 .a['alice']=5a['jessica']=9

  • $1 in a{$3=a[$1]}

    읽을 때 file1.csv첫 번째 필드가 배열의 키로 존재하는 경우 a세 번째 필드는 에 저장된 값으로 업데이트됩니다 a.

    (우리가 읽고 있는) 내용이 $1 in a다음 중 하나 이면 테스트는 참입니다.$1file1.csv열쇠(값 중 하나가 아님) array a.

  • 1

    의 약어입니다 {print}.

  • OFS=,

    그러면 출력 필드 구분 기호가 쉼표로 설정됩니다.

관련 정보