2017-02-16 17 views
0

3つの列に基づいて2つの表の重なりを取得したいとします。複数の列とサブストリングによる2つの表の重複の検出

ファイル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の数で5番目の列は部分文字列です最初のファイルの列1の(11の代わりに、それはchr11と言うでしょう)。表2の4番目と5番目の列は、ファイル1(開始と終了)の列4と5に等しくなければなりません。出力をファイル1のように正確にしたいだけです。要素はファイル2のものと同じでなければなりません。

私はawkの構文に慣れていません。私にとっては直感的ではありませんが、この行、私は1つが、このコマンドを拡張することができると思います:

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 

をそれは両方のリクエストごとに試合を持っている場合は、親切に試してみて、私に知らせてFILE1の値を出力します次に。

解決策の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:あなたが私に与えてくれた人を知らせることができますか?投票してください、あなたはこれについて何かできることがあれば、正当な理由を受け入れることなく、私を落胆させています。 VOTEは本当に落胆しています:( 親切に私をここで助けてください。 – RavinderSingh13

関連する問題