행의 부분 블록에서 유전자 값이 일치하지 않는 행을 필터링하고 싶습니다. 중복된 일관된 값이 있는 경우 첫 번째 행만 유지합니다. 예를 들어 "gf345 part1"에는 여러 유전자 값이 있으므로 이 블록은 삭제되고, "gf345 part3"에는 단일 유전자 값 AT가 반복되므로 첫 번째 행만 유지됩니다.
line part serial geno
ax211 part1 1234 AA
gf345 part1 1345 TT
gf345 part1 3456 AA
gf345 part1 1346 TT
ax211 part2 1834 AA
gf345 part2 1395 TT
gf345 part2 3656 AA
gf345 part2 13746 TT
ax211 part3 1634 AA
gf345 part3 13345 AT
gf345 part3 34256 AT
gf345 part3 13446 AT
나올 것으로 예상됨
line part serial geno
ax211 part1 1234 AA
ax211 part2 1834 AA
ax211 part3 1634 AA
gf345 part3 13345 AT
내가 시도한 것은 다음과 같습니다.
awk 'FNR==NR {a[$1$2]+=$4; b[$1$2]=$4;next}
$1$2 in b {if (a[$1$2] ==1 ) print $0 }
' file file
답변1
가장 간단한 것은 입력을 먼저 정렬하는 것입니다. 이 솔루션은 처리할 수 있는 입력 파일의 크기를 제한하는 배열 사용을 방지합니다.
주문이 문제가 되지 않으면 다음과 같이 작동합니다.
sort file | awk '{
if ($1$2 != key) {
if (valid == 1)
print firstline;
firstline=$0;
key=$1$2;
value=$4;
valid=1
}
else {
if ($4 != value)
valid = 0
}
} END {
if (valid == 1)
print firstline
}'