첫 번째 열과 두 번째 열을 기준으로 두 개의 파일을 병합해야 합니다. 세 번째 열과 네 번째 열의 차이를 추가하고 두 번째 열에 각 유형에 대한 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