私は2つの遺伝子データセットを持っていますが、どちらも染色体位置の列を持っています。各行の染色体位置をファイル2の染色体位置と比較して、ファイル1をフィルタリングしようとしています。 File 1 行は、File 2 のすべての行で指定された染色体位置に対して、File 2 よりも染色体位置が 5000 以上 5000 以上小さい行のみを選択する条件として抽出されます。最終的に、私はファイル1から抽出された遺伝子変異がファイル2の遺伝的変異と5000 +/-より大きい距離を持つように努めています。
たとえば、私のデータは次のようになります。
ファイル1:
Variant Chromosome Position
Variant1 14000
Variant2 9000
Variant3 37000
Variant4 21000
ファイル2:
Variant Chromosome Position
Variant1 10000
Variant2 20000
Variant3 30000
予想出力(ファイル2の各行と比較して位置距離が5000を超える変形):
Variant Chromosome Position
Variant3 37000
2つのファイルからデータを抽出中に問題が見つかりましたが、マッチングかキャンセルかによって異なります。私の問題に+/-条件を適用する項目が見つからず、他の場所で見たり学ぶことができるかどうかわかりません。私はLinuxに初めて触れたので、次のような効果のあるコマンドを書こうとしました。
awk 'BEGIN{FS=OFS="\t"} FNR==1{print;next} {if($2>=+5000 | $2<=-5000) print $0}' file1 file2 > newfile
しかし、動作させる構文はわかりません。助けや指示をくれてありがとう。
答え1
これも試してください(範囲間の「穴」を考慮してください)。
$ awk '
NR == FNR {RGMIN[++IX] = $2 - 5000 # from file2, create min and
RGMAX[IX] = $2 + 5000 # max range boundaries
next
}
FNR == 1 {print # print file1 header; don't process line further
next
}
{PR = 1 # set PRintout logical variable
for (i=2; i<=IX; i++) PR = PR * ($2 < RGMIN[i] || $2 > RGMAX[i])
# reset PR to 0 if $2 inside any of the
# ranges; skip file2's header by starting
# loop at IX 2
}
PR # print if outside ALL ranges
' file2 file1
Variant Chromosome Position
Variant3 37000