異なるファイルのさまざまな基準に基づいてファイル行を選択するには?

異なるファイルのさまざまな基準に基づいてファイル行を選択するには?

2つの遺伝子データセットがあります。 file2 の列に基づいて file1 をフィルタリングします。しかし、file2の2番目の列も考慮する必要がありますが、どうすればよいかわかりません。

ファイル1行抽出の条件は、同じ染色体上に位置するファイル2の行のうち、所与の染色体位置よりも染色体位置が5000以上または5000未満の行のみを選択することである。以下のコードでその一部を実行しましたが、同じ染色体番号内の行のみをフィルタリングすることについては説明しません。

たとえば、私のデータは次のようになります。

ファイル1:

Variant   Chromsome   Chromosome Position  
Variant1      2             14000     
Variant2      1             9000              
Variant3      8             37000          
Variant4      1             21000     

ファイル2:

Variant  Chromosome  Chromosome Position  
Variant1     1                 10000                   
Variant2     1                 20000                   
Variant3     8                 30000                   

期待される出力(同じ染色体上のファイル2の行と比較して位置距離が+/- 5000を超える変形):

Variant   Chromosome Position     Chromosome
Variant1    14000                  2
Variant3    37000                  8

#Variant1 at 14000, whilst within 5000 + of Variant1 at 10000 in file2 is on a different chromosome and therefore not compared and is kept.
#Variant3 is on the same chromosome as Variant4 in file1 but larger than 5000+ distance and is kept.

私はコーディングに以前の質問の答えを使用しました(別のファイルの基準に基づいて1つのファイルから行を選択するには?)染色体を考慮せずにフィルタリングする方法を尋ねます。

awk '
NR == FNR       {RGMIN[++IX] = $2 - 5000                        
                 RGMAX[IX]   = $2 + 5000                        
                 next
                }
FNR == 1        {print                                         
                 next
                }
                {PR = 1                                         

                 for (i=2; i<=IX; i++)  PR = PR * ($3 < RGMIN[i] || $3 > RGMAX[i])                                                                                          
                }
PR                                                             
' file2 file1 > newfile.txt

私は、「file1の行がfile2の染色体番号と一致する場合は、その染色体番号内で5000 +/-フィルタリングのみを実行します」の追加行にifステートメントを追加できるように、構文をよりよく理解しようとしました。他の方法がある場合は、これを私が持っているものに統合する方法がわかりません。

編集する:

それでは、CHROMを追加してみてください。

awk '
NR == FNR       {RGMIN[++IX] = $2 - 500000                        
                 RGMAX[IX]   = $2 + 500000  
                 CHROM[IX] = $2              
                 next
                }
FNR == 1        {print                                         
                 next
                }
                {PR = 1                                         
                 for (i=2; i<=IX; i++) if ($2 == CHROM[i]) PR = PR * ($2 < RGMIN[i] || $2 > RGMAX[i])                                              
                }
PR          
' file2 file1 > newfile.txt               

答え1

コメントで提案したとおり:

awk '
NR == FNR       {RGMIN[++IX] = $3 - 5000                        
                 RGMAX[IX]   = $3 + 5000  
                 CHROM[IX]   = $2              
                 next
                }
FNR == 1        {print                                         
                 next
                }
                {PR = 1                                         
                 for (i=2; i<=IX; i++) if ($2 == CHROM[i]) PR = PR * ($3 < RGMIN[i] || $3 > RGMAX[i])                                              
                }
PR          
' file2 file1 
Variant   Chromsome   Chromosome Position  
Variant1      2             14000     
Variant3      8             37000          

答え2

file1 に対する file2 の重みに応じて file2 をマップし、file1 の場所がまだマップされていないかどうかをテストすることもできます。

 awk 'FNR==NR{for (i=$3-5000; i<=$3+5000; i++){v[$2"."i]=1}}
      FNR!=NR{if (! v[$2"."$3]) print $0}
      ' file2 file1 

このデータセットの場合、@RudiCよりも遅いですが、file2に複数の重複範囲が多い場合は、より価値がある可能性があります。

関連情報