我有一个问题,让我有点头疼,但它往往不需要作为一个相对初学者.
我有一个看起来像这样的文件
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,因为它并没有真正做任何花哨的事情,但这需要我更多的时间来弄明白.
标签:bash,linux,awk,text-processing
来源: https://codeday.me/bug/20190814/1652282.html