2017-02-16 68 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