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

Unix 使用awk比较bam文件中列的两行,unix,awk,Unix,Awk,我试图比较bam文件中单个列的两行。首先在第1列中查找匹配的条目,然后,如果第1列中的条目匹配,则比较第2列并查找不匹配的条目 为了读取文件并保留标题,我首先必须打开文件并对其进行管道传输,然后使用命令以相同的格式保留: samtools -h file.bam | command I need here > file_filtered.bam 标题是多行的,而不仅仅是一行。所有标题行都以“@”开头 在标头之后,bam文件如下所示: 00b27c71-a833-4605-9fb3-a27

我试图比较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的变体,但都没有用。还有更多的列,我想打印与条件匹配的行的所有列。任何帮助都将不胜感激


谢谢

请您尝试以下内容,并让我知道这是否对您有帮助。它读取输入_文件2次

awk 'BEGIN{FS="\t"}FNR==NR{a[$1,$2]++;next} a[$1,$2]==1' Input_file  Input_file
EDIT:由于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]}}}' 

请将该示例输入所需的输出添加到您的问题中。@csijcs,它一点也不清楚,正如Cyrus所提到的,请在代码标签
{}
按钮中将示例输出添加到您的帖子中。我已经编辑过了。我想在第1列中找到所有匹配的行,但在第2列中不匹配,并打印这些行的所有列(还有许多隐藏的列,它们对比较不感兴趣)