用awk比较bam文件中一列的两行

时间:2018-07-09 05:12:18

标签: unix awk

我正在尝试比较bam文件中单个列的两行。首先在第1列中找到匹配的条目,然后,如果第1列中的条目匹配,则比较第2列并查找不匹配的条目。

为了读取文件并保留标题,我首先必须打开文件并将其通过管道传输,然后使用以下命令以相同格式保存:

samtools -h file.bam | command I need here > file_filtered.bam

标题是多行,而不仅仅是一行。所有标题行均以“ @”开头。

标题之后,bam文件如下:

00b27c71-a833-4605-9fb3-a2714ac98091    ENST00000352983.6   157 60  16
00b27c71-a833-4605-9fb3-a2714ac98091    ENST00000258424.2   12  60 2048
00d77e65-466e-4fe6-ad0f-bc6b3f44af75    ENST00000367142.4   8   60 0
00d77e65-466e-4fe6-ad0f-bc6b3f44af75    ENST00000367142.4   130 12  4

我想在第一列中找到匹配的行,但是在第二列中不找到匹配的行,就像上面的前两行一样。最后两行在第1列匹配,但在第2列也匹配,所以我不感兴趣。上面期望的输出只是前两行:

00b27c71-a833-4605-9fb3-a2714ac98091    ENST00000352983.6   157 60  16
00b27c71-a833-4605-9fb3-a2714ac98091    ENST00000258424.2   12  60 2048

我尝试了一些awk的变体,但无济于事。还有更多列,我想为符合条件的行打印所有列。任何帮助将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:1)

能否请您尝试以下操作,如果有帮助,请告诉我。它读取Input_file 2次。

awk 'BEGIN{FS="\t"}FNR==NR{a[$1,$2]++;next} a[$1,$2]==1' Input_file  Input_file

编辑: :由于OP在注释中告知OP正在将命令的输出传递给awk,并且OP也未显示该命令,因此您可以使用正在关注。

your_command | awk 'BEGIN{FS="\t"}FNR==1{print;next}{a[$1,$2]++;b[$1,$2]=$0} END{for(i in a){if(a[i]==1){print i,b[i]}}}' 

EDIT2: :要按照OP保留标题,请立即添加此解决方案。

your_command | awk 'BEGIN{FS="\t"}FNR==1||/^@/{print;next}{a[$1,$2]++;b[$1,$2]=$0} END{for(i in a){if(a[i]==1){print b[i]}}}'