awk를 사용하여 두 개의 csv 파일을 비교하고 값을 추가합니다.

awk를 사용하여 두 개의 csv 파일을 비교하고 값을 추가합니다.

다음과 같은 두 개의 파일이 있습니다. 파일 1.csv

+------------+----------+--------+---------+
| Account_ID | Asset_ID | LOT_ID | FLAG_F1 |
+------------+----------+--------+---------+
|      10000 |    20000 |  30000 | Y       |
|      10001 |    20001 |  30001 | N       |
|      10002 |    20002 |  30002 | Y       |
|      10003 |    20003 |  30003 | N       |
|      10004 |    20004 |  30004 | Y       |
|      10005 |    20005 |  30005 | N       |
|      10006 |    20006 |  30006 | Y       |
+------------+----------+--------+---------+

파일 2.csv

   +------------+----------+--------+---------+-----+-----+
| Account_ID | Asset_ID | LOT_ID | FLAG_F2 | XYZ | ABC |
+------------+----------+--------+---------+-----+-----+
|      10000 |    20000 |  30000 | Y       | XYZ | ABC |
|      10001 |    20001 |  30001 | Y       | XYZ | ABC |
|      10002 |    20002 |  30002 | Y       | XYZ | ABC |
|      10003 |    20003 |  30003 | Y       | XYZ | ABC |
|      10004 |    20004 |  30004 | Y       | XYZ | ABC |
|      10005 |    20005 |  30005 | Y       | XYZ | ABC |
|      10006 |    20006 |  30006 | Y       | XYZ | ABC |
|      10006 |    20006 |  30006 | Y       | XYZ | ABC |
|      10006 |    20006 |  30006 | Y       | XYZ | ABC |
+------------+----------+--------+---------+-----+-----+

나는 다음을 얻으려고 노력하고 있습니다산출:

    +------------+----------+--------+---------+-----+-----+---------+
| Account_ID | Asset_ID | LOT_ID | FLAG_F2 | XYZ | ABC | FLAG_F1 |
+------------+----------+--------+---------+-----+-----+---------+
|      10000 |    20000 |  30000 | Y       | XYZ | ABC | Y       |
|      10001 |    20001 |  30001 | Y       | XYZ | ABC | N       |
|      10002 |    20002 |  30002 | Y       | XYZ | ABC | Y       |
|      10003 |    20003 |  30003 | Y       | XYZ | ABC | N       |
|      10004 |    20004 |  30004 | Y       | XYZ | ABC | Y       |
|      10005 |    20005 |  30005 | Y       | XYZ | ABC | N       |
|      10006 |    20006 |  30006 | Y       | XYZ | ABC | Y       |
|      10006 |    20006 |  30006 | Y       | XYZ | ABC | Y       |
|      10007 |    20007 |  30006 | Y       | XYZ | ABC |         |
|      10006 |    20003 |  30006 | Y       | XYZ | ABC |         |
+------------+----------+--------+---------+-----+-----+---------+

위 출력에서 FLAG_F1​​의 조건 file1.csv과 의 값에 를 추가했습니다. 조건이 실패하면 비어 있을 수 있습니다.file2.csvAccount_ID,Asset_ID,LOT_IDfile1.csvfile2.csv

awk를 사용하여 다음 코드를 시도했습니다.awk를 사용하여 두 개의 .csv 파일 비교

awk -F',' '
    FNR == NR {
        if (FNR == 1) {next}
        a[$1] = $2;
        b[$1] = $3;
        next;
    }
    {
        if (FNR == 1) {print;next}
        if (a[$1] == $2) {
            print $1,$2,$3,b[$1];
        }
        else {
            print $1,a[$1],b[$1],b[$1];
        }
    }
  ' OFS=',' file1.csv file2.csv

누군가가 나에게 위 코드를 한 줄씩 설명해 줄 수 있다면 더 좋을 것입니다.

답변1

이것은 연결된 질문보다 훨씬 간단합니다. 필요한 것은 다음과 같습니다.

awk -F, -v OFS=, 'NR==FNR{a[$1$2$3]=$4; next}{print $0,a[$1$2$3]}' file1 file2

설명하다

  • -F,: 입력 필드 구분 기호를 쉼표로 설정합니다.
  • -v OFS=,: 출력 필드 구분 기호를 쉼표로 설정합니다. 기본적으로 이는 쉼표로 구분된 출력을 인쇄하는 데 유용합니다.
  • NR==FNR: NR은 현재 줄 번호, FNR은 현재 파일의 줄 번호입니다. 첫 번째 파일을 읽는 경우에만 둘 다 동일합니다.
  • a[$1$2$3]=$4; next: 이것이 첫 번째 파일인 경우(위 참조) 키가 연결된 첫 번째, 두 번째 및 세 번째 필드인 배열에 네 번째 필드를 저장합니다.
  • print $0,a[$1$2$3]:현재 행( )과 처음 세 필드와 연관된 배열 $0의 값을 인쇄합니다. a첫 번째 파일에 해당하는 네 번째 필드입니다.

답변2

awk -F',' ' # start awk and use comma as a field separator
    FNR == NR { # if processed so far number of rows in current file if equal to overall processed number of rows do things in block {} 
        if (FNR == 1) {next} # if it is first row then continue (skip to next row)
        a[$1] = $2; # create an array indexed with first field, with value of second field
        b[$1] = $3; # another array
        next; # go to next row
    } # end of block executed only for first file
    { # beginning of block which will be executed without any initial conditions
        if (FNR == 1) {print;next} # if first row of file then print it and go to next one
        if (a[$1] == $2) { # if array value which correspond to field first is equal to second field do something (array 'a' has been set in first file, and now we input index to file from second file knowing that first fields of those files are the same)
            print $1,$2,$3,b[$1]; # print field 1-3 and array b[$1]
        }
        else { # if array is not equal
            print $1,a[$1],b[$1],b[$1]; # print stuff
        }
    }
  ' OFS=',' file1.csv file2.csv # OFS means output field separator, so we want to have comma in result too.

관련 정보