我有一个问题,让我有点头疼,但它往往不需要作为一个相对初学者.
ID A1 A2 A3
1 A G A
2 T G A
3 T A G
4 T G A
5 A A G
6 A C A
7 C T G
它是数千行,由G,C,T,A组成,其中G补充C和A补充T.我要做的是在A2或A3中搜索A1的匹配.如果存在匹配,则将其保持原样并且如果不将A2和A3改变为它们的补码,即A = T且G = C,反之亦然.
所以输出将是:
ID A1 A2 A3
1 A G A
2 T C T
3 T T C
4 T C T
5 A A G
6 A C A
7 C A C
我想我可以通过使用awk过滤匹配和不匹配的ID来实现它:
awk '{if($2 != $3 || $2 != $4) print $0}' mergedlist > nonmatchlist
和
awk '{if($2 == $3 || $2 == $4) print $0}' mergedlist > matchlist
但它只适用于一个变量,即前者的T和后者的A.
非常感谢您的投入.
解决方法:
perl -lane 'sub flip { if ($_[0] eq "T") { "A" } elsif ($_[0] eq "A") { "T" } elsif ($_[0] eq "G") { "C" } elsif ($_[0] eq "C") { "G" } else { $_[0] } } if (!($F[1] eq $F[2] or $F[1] eq $F[3])) { $F[2] = flip($F[2]); $F[3] = flip($F[3]) } print "@F"' < input
应该很容易移回到awk,因为它并没有真正做任何花哨的事情,但这需要我更多的时间来弄明白.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。