微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – 使用awk进行多列匹配和调整

我有一个问题,让我有点头疼,但它往往不需要作为一个相对初学者.

我有一个看起来像这样的文件

    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] 举报,一经查实,本站将立刻删除。

相关推荐