두 파일의 열을 병합하고 수정하는 방법

두 파일의 열을 병합하고 수정하는 방법

첫 번째 열과 두 번째 열을 기준으로 두 개의 파일을 병합해야 합니다. 세 번째 열과 네 번째 열의 차이를 추가하고 두 번째 열에 각 유형에 대한 TOTAL 행을 추가해야 합니다. 다음은 두 개의 입력 파일입니다.

파일 1:

VALIDATION_DATA_DBF           DELETE  226  6.4
TXT_DBF                       DELETE  80   0.15
DEFAULT_PROFILE               SELECT  45   1.2
TRAINING_DBF                  SELECT  130  5.25
TESTING_DBF                   SELECT  5    0.001
WARNING_DBF                   UPDATE  8    0.055
WARNING_DBF                   INSERT  5    2.4

파일 2:

VALIDATION_DATA_DBF           DELETE  200  7.4
TXT_DBF                       DELETE  70   1.15
DEFAULT_PROFILE               SELECT  40   0.2
TRAINING_DBF                  SELECT  135  7.25
TESTING_DBF                   SELECT  7    0.009
PERF_DBF                      SELECT  10   0.004
WARNING_DBF                   UPDATE  2    1.055

결합된 출력 파일은 다음과 같아야 합니다.

TABLE                TYPE    COUNT1 COUNT2 DIFF_COUNT TIME1 TIME2 DIFF_TIME
VALIDATION_DATA_DBF  DELETE  226    200    26         6.4    7.4    -1
TXT_DBF              DELETE  80     70     10         0.15   1.15   -1
TOTAL                DELETE  306    270    36         6.55   8.55   -2
DEFAULT_PROFILE      SELECT  45     40     5          1.2    0.2     1   
TRAINING_DBF         SELECT  130    135    -5         5.25   7.25   -2
TESTING_DBF          SELECT  5      7      -2         0.001  0.009  -0.008
PERF_DBF             SELECT  0      10     -10        0      0.004  -0.004
TOTAL                SELECT  180    192    -12        6.451  7.463  -1.012 
WARNING_DBF          UPDATE  8      2      6          0.055  1.055  -1
TOTAL                UPDATE  8      2      6          0.055  1.055  -1
WARNING_DBF          INSERT  5      0      5          2.4    0      2.4
TOTAL                INSERT  5      0      5          2.4    0      2.4   

답변1

배열 배열 및 ARGIND와 함께 GNU awk 사용:

awk '
    {
        counts[$2][$1][ARGIND] = $3
        times[$2][$1][ARGIND] = $4
    }
    END {
        print "TABLE", "TYPE", \
            "COUNT1", "COUNT2", "DIFF_COUNT", \
            "TIME1", "TIME2", "DIFF_TIME"
    
        for ( type in counts ) {
            delete totCounts
            delete totTimes
            for ( table in counts[type] ) {
                print table, type,                                   \
                    counts[type][table][1]+0,                        \
                    counts[type][table][2]+0,                        \
                    counts[type][table][1] - counts[type][table][2], \
                    times[type][table][1]+0,                         \
                    times[type][table][2]+0,                         \
                    times[type][table][1] - times[type][table][2]
    
                totCounts[1] += counts[type][table][1]
                totCounts[2] += counts[type][table][2]
                totTimes[1]  += times[type][table][1]
                totTimes[2]  += times[type][table][2]
            }
            print "TOTAL", type, \
                totCounts[1], totCounts[2], totCounts[1] - totCounts[2], \
                totTimes[1],  totTimes[2],  totTimes[1]  - totTimes[2]
        }
    }
' file1 file2 | column -t
TABLE                TYPE    COUNT1  COUNT2  DIFF_COUNT  TIME1  TIME2  DIFF_TIME
VALIDATION_DATA_DBF  DELETE  226     200     26          6.4    7.4    -1
TXT_DBF              DELETE  80      70      10          0.15   1.15   -1
TOTAL                DELETE  306     270     36          6.55   8.55   -2
WARNING_DBF          UPDATE  8       2       6           0.055  1.055  -1
TOTAL                UPDATE  8       2       6           0.055  1.055  -1
WARNING_DBF          INSERT  5       0       5           2.4    0      2.4
TOTAL                INSERT  5       0       5           2.4    0      2.4
PERF_DBF             SELECT  0       10      -10         0      0.004  -0.004
TESTING_DBF          SELECT  5       7       -2          0.001  0.009  -0.008
TRAINING_DBF         SELECT  130     135     -5          5.25   7.25   -2
DEFAULT_PROFILE      SELECT  45      40      5           1.2    0.2    1
TOTAL                SELECT  180     192     -12         6.451  7.463  -1.012

답변2

파일별, 테이블별, 종류별 개수와 시간을 저장해야 합니다. 두 개의 배열과 하나의 배열을 사용하여 테이블을 유형에 연결하는 것이 더 좋습니다. END 섹션에서는 평가가 완료됩니다. 논리는 많지 않지만 입력할 텍스트가 많습니다. 시도해 보세요.

awk '
FNR == 1        {FN++
                }
                {CNT[FN,$1,$2] = $3
                 TIM[FN,$1,$2] = $4
                 if (!index(TYP[$2], $1)) TYP[$2] = TYP[$2] $1 FS
                }
END             {print "TABLE               TYPE    COUNT1 COUNT2 DIFF_COUNT  TIME1 TIME2 DIFF_TIME"
                 for (t in TYP) {TC1 = TC2 = TDF = TT1 = TT2 = TTF = 0
                                 for (m=split(TYP[t], T); m; m--)       {TBL = T[m]
                                                                         IX1 = 1 SUBSEP TBL SUBSEP t
                                                                         IX2 = 2 SUBSEP TBL SUBSEP t
                                                                         printf "%-20s%-8s%-7d%-7d%-10d  %-6g%-6g%-6g\n", TBL, t, CNT[IX1]+0, CNT[IX2]+0, CNT[
                                                                         TC1 += CNT[IX1]
                                                                         TC2 += CNT[IX2]
                                                                         TDF += CNT[IX1] - CNT[IX2]
                                                                         TT1 += TIM[IX1]
                                                                         TT2 += TIM[IX2]
                                                                         TTF += TIM[IX1] - TIM[IX2]
                                                                        }
                                 printf "%-20s%-8s%-7d%-7d%-10d  %-6g%-6g%-6g \n",  "TOTAL", t, TC1, TC2, TDF, TT1, TT2, TTF
                                }
                }
' OFS="\t" file[12]

TABLE               TYPE    COUNT1 COUNT2 DIFF_COUNT  TIME1 TIME2 DIFF_TIME
TXT_DBF             DELETE  80     70     10          0.15  1.15  -1    
VALIDATION_DATA_DBF DELETE  226    200    26          6.4   7.4   -1    
TOTAL               DELETE  306    270    36          6.55  8.55  -2     
WARNING_DBF         INSERT  5      0      5           2.4   0     2.4   
TOTAL               INSERT  5      0      5           2.4   0     2.4    
PERF_DBF            SELECT  0      10     -10         0     0.004 -0.004
TESTING_DBF         SELECT  5      7      -2          0.001 0.009 -0.008
TRAINING_DBF        SELECT  130    135    -5          5.25  7.25  -2    
DEFAULT_PROFILE     SELECT  45     40     5           1.2   0.2   1     
TOTAL               SELECT  180    192    -12         6.451 7.463 -1.012 
WARNING_DBF         UPDATE  8      2      6           0.055 1.055 -1    
TOTAL               UPDATE  8      2      6           0.055 1.055 -1     

관련 정보