これを行う方法があると確信していますが、詰まって助けてほしいです。以下のように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
- 重複反復を避けるためにループの中断