別のファイルの基準に基づいて1つのファイルから行を選択するには?

別のファイルの基準に基づいて1つのファイルから行を選択するには?

私は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

おすすめ記事