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