我正在尝试比较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的变体,但无济于事。还有更多列,我想为符合条件的行打印所有列。任何帮助将不胜感激。
谢谢!
答案 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]}}}'