2개의 csv 파일은 3번째 파일에서 입력된 컬럼별 데이터 비교를 수행합니다.

2개의 csv 파일은 3번째 파일에서 입력된 컬럼별 데이터 비교를 수행합니다.

3개의 파일이 있습니다.

file1에는 다음과 같은 데이터가 있습니다.

A,B,C,D,E,F,G
1,2,3,4,5,6,7
7,6,5,4,3,2,1

file2에는 다음과 같은 데이터가 있습니다.

A,B,C,D,E,F,G
1,2,3,4,5,5,7
7,6,6,4,3,2,1

file3에는 A라는 필드가 하나만 있습니다.

A
1
2
7

이제 file3에서 사용할 수 있는 A열의 file1과 file2를 비교하고 싶습니다.

열 헤더와 열 수는 두 파일에서 동일합니다.

원하는 출력

Item  FILE1   FILE2
1     F=6     F=5
7     C=5     C=6

더 많은 열이 일치하지 않는 경우

   A,B,C,D,E,F,G
   1,2,3,4,5,5,7
   7,6,5,2,3,2,1

   A,B,C,D,E,F,G
   1,2,3,1,4,6,7
   7,6,6,4,3,2,1

그러면 출력은 다음과 같아야합니다

Item    FILE1   FILE2
1       D=4     D=1
        E=5     E=4
        F=5     F=6
7       C=5     C=6
        D=2     D=4

이는 예입니다. 열 수는 다양할 수 있지만 File1과 File2에서는 항상 동일합니다. 그러므로 이전 질문과 다릅니다.

답변1

#!/bin/bash

join -t, file_1 file_2 | join -t, - file_3 |
awk -F, '
NR == 1 {
    fields_num = (NF + 1) / 2

    for(i = 1; i <= fields_num; i++)
        field_names[i] = $i
}
NR != 1 {
    item = $1 "\t"

    for(i = 2; i <= fields_num; i++) {
        cmp_num = i + fields_num - 1

        if($i != $cmp_num) {
            printf "%s%s=%s\t%s=%s\n",
                    item,
                    field_names[i], $i,
                    field_names[i], $cmp_num

            item = "\t"
        }

    }
}'

몇 가지 가정을 했습니다.

  1. 비교에 사용되는 열이 항상 첫 번째입니다.
  2. 모든 파일은 A첫 번째 열(필드)을 기준으로 정렬됩니다.
  3. file_1두 파일(and)에 나타나는 항목 만 비교하십시오 . file_2따라서 file_1item 이 있지만 2없으면 file_2해당 행은 비교에서 제외됩니다.

입력하다

tail -n +1 -- file_*

==> file_1 <==
A,B,C,D,E,F,G
1,2,3,4,5,5,7
7,6,5,2,3,2,1

==> file_2 <==
A,B,C,D,E,F,G
1,2,3,1,4,6,7
7,6,6,4,3,2,1

==> file_3 <==
A
1
2
7

산출

1   D=4 D=1
    E=5 E=4
    F=5 F=6
7   C=5 C=6
    D=2 D=4

관련 정보