첫 번째 열을 기준으로 2개의 파일 사이에서 두 번째와 세 번째 열을 빼고 diff_column_2(DIFF-IO)=diff_column_3(DIFF-SELECT)=0인 행을 표시하지 않아야 합니다.두 파일 모두에 존재하고 출력에서 END에 남아 있어야 하는 마지막 줄을 제외하고 순서는 무작위로 지정될 수 있습니다.
이것 ref_file
:
testing 20 10
jobs 15 20
issues 0 1
work 15 25
Total 50 56
이것 head_file
:
testing 20 10
jobs 15 30
work 12 25
games 1 2
Total 48 67
원하는 출력:
TABLE,REF-IO,HEAD-IO,DIFF-IO,REF-SELECT,HEAD-SELECT,DIFF-SELECT
jobs,15,15,0,20,30,-10
work,15,12,3,25,25,0
games,0,1,-1,0,2,-2
issues,0,0,0,1,0,1
Total,50,48,2,56,67,-11
답변1
awk '
BEGIN {
print "TABLE,REF-IO,HEAD-IO,DIFF-IO,REF-SELECT,HEAD-SELECT,DIFF-SELECT"
OFS = ", "
}
FNR==NR {
A[$1]=$2
B[$1]=$3
next
}
{
if (!($1 in A)) {
A[$1] = B[$1] = 0
}
diff_io = $2 - A[$1]
diff_sel= $3 - B[$1]
C[$1] = 1
}
diff_io || diff_sel {
if (first) {
print line
}
first = 1
line = $1 OFS $2 OFS A[$1] OFS diff_io OFS $3 OFS B[$1] OFS diff_sel
}
END {
for (name in A) {
if (!(name in C)) {
print name, 0, A[name], -A[name], 0, B[name], -B[name]
}
}
print line
}
' head_file ref_file
간단히 입력하려면 다음을 수행하여 작업을 수행할 수 있습니다 join
.
join -a1 -a2 -e0 <(sort head_file) <(sort ref_file) -o0,1.2,2.2,0,1.3,2.3 |
awk '
BEGIN {
print "TABLE,REF-IO,HEAD-IO,DIFF-IO,REF-SELECT,HEAD-SELECT,DIFF-SELECT"
OFS = ", "
}
{
$4=$2-$3
$7=$5-$6
}
/Total/ {
end=$0
next
}
$4!=0 || $7!=0;
END {
print end
}'