2017-02-16 67 views
0

我想根据三列获取两个表之间的重叠。在多个列和子串之间查找两个表之间的重叠

文件1

Chr  B  C  Start End F G E D 
chr1 HAVANA gene 11869 14409 . + . gene_id "ENSG00000223972.5"; gene_type "transcribed_unprocessed_pseudogene"; gene_status "KNOWN"; gene_name "DDX11L1"; level 2; havana_gene "OTTHUMG00000000961.2"; 
chr1 HAVANA gene 100000 112000 . + . gene_id "ENSG00000223972.5"; gene_type "transcribed_unprocessed_pseudogene"; gene_status "KNOWN"; gene_name "DDX11L1"; level 2; havana_gene "OTTHUMG00000000961.2"; 
chr3 HAVANA gene 11870 14409 . + . gene_id "ENSG00000223972.5"; gene_type "transcribed_unprocessed_pseudogene"; gene_status "KNOWN"; gene_name "DDX11L1"; level 2; havana_gene "OTTHUMG00000000961.2"; 
chr3 HAVANA gene 11839 11869 . + . gene_id "ENSG00000223972.5"; gene_type "transcribed_unprocessed_pseudogene"; gene_status "KNOWN"; gene_name "DDX11L1"; level 2; havana_gene "OTTHUMG00000000961.2"; 
chr2 HAVANA gene 11869 14409 . + . gene_id "ENSG00000223972.5"; gene_type "transcribed_unprocessed_pseudogene"; gene_status "KNOWN"; gene_name "DDX11L1"; level 2; havana_gene "OTTHUMG00000000961.2"; 

....

文件2

A      B   Start End Chr   D 
ENSG00000177697  ENST00000525333 832986 833026 11   1 
ENSG00000197283  ENST00000876382 100000 112000 1   1 
ENSG00000194582  ENST00000184632 11869 14409 2   1 
ENSG00000174528  ENST00000241053 154728 184728 12   1 
ENSG00000103629  ENST00000816493 832986 917483 13   1 
ENSG00000183628  ENST00000816472 711633 782163 11   1 
ENSG00000192748  ENST00000164924 832986 982732 CHK_1231 1 
ENSG00000183643  ENST00000917473 183728 194873 3   1 
ENSG00000183647  ENST00000184637 800000 819483 2   1 
ENSG00000177697  ENST00000184627 100023 120000 11   1 

希望的输出:

Chr  B  C  Start End F G E D 
chr1 HAVANA gene 100000 112000 . + . gene_id "ENSG00000223972.5"; gene_type "transcribed_unprocessed_pseudogene"; gene_status "KNOWN"; gene_name "DDX11L1"; level 2; havana_gene "OTTHUMG00000000961.2"; 
chr2 HAVANA gene 11869 14409 . + . gene_id "ENSG00000223972.5"; gene_type "transcribed_unprocessed_pseudogene"; gene_status "KNOWN"; gene_name "DDX11L1"; level 2; havana_gene "OTTHUMG00000000961.2"; 

的问题是,在文件2中的数第五列是一个子字符串第一个文件的第一列(所以而不是11,它会说chr11)。表2的第4和第5列应该与文件1(开始和结束)中的第4列和第5列相同。我想输出完全看起来像文件1,只是元素应该等于文件2中的元素。

我不熟悉awk语法,对我来说这不是直观的,但我在通过先前的帖子进行扫描时发现这条线,我想一个可能会扩大这个命令:

awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0, a[$1]}' file2 file1 > file1_subset2 
+1

[编辑]你的问题包括更多的样本输入(行和不匹配的行)以及给定输入的预期输出。 –

+1

*问题是第5列中的文件2中的数字是第一个文件的第1列的子字符串(所以不是11,它会说chr11)。*这很混乱。 '11'不是'chr1'的子字符串。 *“它会说”*是指什么?你在你的问题中是否可以交换使用* table *和* file *?什么是专栏*“应该是平等的”*? –

回答

0

@ELHL:尝试:

awk 'FNR==NR{sub(/[[:alpha:]]+/,"",$1);A[$1,$4,$5]=$0;next} {sub(/[[:alpha:]]+/,"",$(NF-1));} ((($NF-1),$3,$4) in A){print A[($NF-1),$3,$4]}' SUBSEP=, Input_file1 Input_file2 

这将打印文件1的值,如果都有匹配根据您的要求,请尝试,让我知道然后。

现在也添加一种非线性形式的解决方案。

awk 'FNR==NR{ 
       sub(/[[:alpha:]]+/,"",$1); 
       A[$1,$4,$5]=$0; 
       next 
      } 
      { 
       sub(/[[:alpha:]]+/,"",$(NF-1)); 
      } 
    ((($NF-1),$3,$4) in A){ 
           print A[($NF-1),$3,$4] 
          } 
    ' SUBSEP=, Input_file1 Input_file2 

EDIT2:添加一个功能,我可以删除2次分的写作这是做在不同的领域相同的操作实际。

awk 'function remove_chars(a){sub(/[[:alpha:]]+/,"",$a)} FNR==NR{remove_chars($1);A[$1,$4,$5]=$0;next} {remove_chars($(NF-1));} ((($NF-1),$3,$4) in A){print A[($NF-1),$3,$4]}' SUBSEP=, Input_file1 Input_file2 

非单线形式的解决方案也如下。

awk 'function remove_chars(a){ 
           sub(/[[:alpha:]]+/,"",$a) 
          } 
    FNR==NR     { 
           remove_chars($1); 
           A[$1,$4,$5]=$0; 
           next 
          } 
          { 
           remove_chars($(NF-1)); 
          } 
    ((($NF-1),$3,$4) in A) { 
           print A[($NF-1),$3,$4] 
          } 
    ' SUBSEP=, Input_file1 Input_file2 
+0

@MODs:请让我知道是谁给了我-ve VOTE,现在几乎每天都在发生,这让我很沮丧,如果你们可以对此做点什么,但没有给出适当的理由接受, ve VOTE确实令人沮丧:( 请在这里帮助我。 – RavinderSingh13