일관성이 없는 데이터 블록 필터링

일관성이 없는 데이터 블록 필터링

행의 부분 블록에서 유전자 값이 일치하지 않는 행을 필터링하고 싶습니다. 중복된 일관된 값이 있는 경우 첫 번째 행만 유지합니다. 예를 들어 "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
}'

관련 정보