아래와 같이 변경 사항이 거의 없고 다른 열도 거의 없는 유사한 첫 번째, 두 번째 및 세 번째 열이 있는 두 개의 파일이 있습니다.
파일 1:
AT1 AT22 24 1 ATAGATA ATTATAT
AT2 AT24 22 0 ATAGATA ATTATAT
AT3 AT23 263 3 ATAGATA ATTATAT
AT4 AT28 252 6 ATAGATA ATTATAT
또한 파일 2에서:
AT1 AT22 22 1 ATAGATA ATTATAT
AT3 AT23 265 1 ATAGATA ATTATAT
AT4 AT28 253 1 ATAGATA ATTATAT
출력은 세 번째 열에 + 또는 -2 완화를 적용하여 이러한 파일을 통합하고 고유해야 합니다. 처음 세 열이 이러한 조건과 일치하면 두 파일 모두에서 네 번째 열을 추가해야 하며, 다른 파일은 평소대로 인쇄해야 합니다. 마치
AT1 AT22 24 2 ATAGATA ATTATAT
AT2 AT24 22 0 ATAGATA ATTATAT
AT3 AT23 263 4 ATAGATA ATTATAT
AT4 AT28 252 7 ATAGATA ATTATAT
답변1
awk '
NR==FNR {
a[$1,$2] = $3
val[$1,$2] = $4
next
}
($1,$2) in a {
for (n=$3-2; n<=$3+2; n++)
if (a[$1,$2] == n) {
$4+=val[$1,$2]
break
}
}
{print}
' file2 file1
AT1 AT22 24 2 ATAGATA ATTATAT
AT2 AT24 22 0 ATAGATA ATTATAT
AT3 AT23 263 4 ATAGATA ATTATAT
AT4 AT28 252 7 ATAGATA ATTATAT
답변2
이는 귀하의 요구 사항을 충족해야 합니다(내 테스트 사례에 관한 한).
#!/bin/bash
# Concatenating the 2 files and sorting entries
SRC=`cat file1 file2 | sort `
FLAG="OFF"
i=1
while read a b c d e
do
# Need an initial array to start comparing
if [ "$i" -eq "1" ];then
init_vals=( "$a" "$b" "$c" "$d" "$e" )
FLAG="ON"
else
# Start comparing
vals=( "$a" "$b" "$c" "$d" "$e" )
if [[ ${vals[0]} == "${init_vals[0]}" && ${vals[1]} == "${init_vals[1]}" ]]
then
# First and second column are identical, checking in delta on third meet the requirements
delta=`expr ${vals[2]} - ${init_vals[2]}`
if [ "$delta" -ge "-2" -a "$delta" -le "2" ]
then
# It does, adding values on column 4 and keeping other columns
sum_col4=`expr ${vals[3]} + ${init_vals[3]}`
vals=( "${init_vals[0]}" "${init_vals[1]}" "${init_vals[2]}" "$sum_col4" "${init_vals[4]}" )
#This is a tracker, we don't print result until conditions are not met
FLAG="ON"
else
#Delta on column 3 is not met
FLAG="OFF"
fi
else
#Column 1 and 2 are different
FLAG="OFF"
fi
# echo "$FLAG"
if [[ $FLAG != "ON" ]];then
echo ${init_vals[@]}
FLAG="ON"
fi
init_vals=( "${vals[@]}" )
fi
(( i++ ))
done <<< "$SRC"
#Printing last lastline
echo ${init_vals[@]}