过滤掉不一致的数据块

过滤掉不一致的数据块

我想过滤掉行部分块中基因值不一致的行。如果存在重复的一致值,我只会保留第一行。例如,“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
}'

相关内容