ファイル間相互参照列

ファイル間相互参照列

これを行う方法があると確信していますが、詰まって助けてほしいです。以下のように2つのファイルがあります。

ファイル1:

8750    11.29592283
8800    7.500359335
14150   3.281781819
23850   3.668931975
23900   14.69918465
23950   5.259260427
27300   3.374571119

ファイル2:

hypothetical protein CDS                7152            7346            TK0006
hypothetical protein CDS                7399            7614            TK0007
DNA methylase CDS               7655            8755            TK0008
hypothetical protein CDS                8760            10093           TK0009
hypothetical protein CDS                10095           10379           TK0010
hypothetical protein CDS                10385           10807           TK0011

File1 はゲノム座標と発現値、File2 はゲノム注釈です。私が必要とするのは、列1ファイル1の値が列2ファイル2と列3ファイル3の間にある場合は、各ファイルの行全体を返すことです。たとえば、file1 の最初の 2 行は次の出力を返します。

8750    11.29592283    DNA methylase CDS               7655            8755            TK0008
8800    7.500359335    hypothetical protein CDS                8760            10093           TK0009

短いawkコマンドまたは同様のコマンドを使用して、これらのプロセスは可能ですか?それとも、私が噛むことができるよりももっと噛んでいるのでしょうか?

ありがとうございます! !

答え1

アッ解決策:

awk -F'[[:space:]][[:space:]]+' 'NR==FNR{ a[$1]=$0; next }
     {  for(i in a) { 
            if (int(i) >= $2 && int(i) <= $3) { 
                print a[i],$0; delete a[i]; break 
            } 
        }
     }' File1 OFS='\t' File2

出力:

8750    11.29592283 DNA methylase CDS               7655            8755            TK0008
8800    7.500359335 hypothetical protein CDS                8760            10093           TK0009

  • -F'[[:space:]][[:space:]]+'- フィールド区切り文字を定義するパターン

  • a[$1]=$0- それからコア価値を得るFile1

  • if (int(i) >= $2 && int(i) <= $3)- 最初のフィールド値がFile1範囲(2番目と3番目のフィールド値の間File2)内にあることを確認してください。

  • delete a[i]- 一致する値を削除

  • break- 重複反復を避けるためにループの中断

関連情報