linux 匹配多个字段,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,因为它并没有真正做任何花哨的事情,但这需要我更多的时间来弄明白.

标签:bash,linux,awk,text-processing

来源: https://codeday.me/bug/20190814/1652282.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值