다른 파일의 여러 기준에 따라 파일 행을 선택하는 방법은 무엇입니까?

다른 파일의 여러 기준에 따라 파일 행을 선택하는 방법은 무엇입니까?

2개의 유전자 데이터 세트가 있습니다. file2의 열을 기반으로 file1을 필터링합니다. 그러나 file2의 두 번째 열도 고려해야 하는데 어떻게 해야 할지 모르겠습니다.

파일 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.

저는 코딩을 위해 이전 질문의 답변을 사용했습니다(다른 파일의 기준에 따라 한 파일에서 행을 선택하는 방법은 무엇입니까?) 염색체를 고려하지 않고 필터링하는 방법을 묻습니다.

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에 여러 개의 겹치는 범위가 많으면 더 가치가 있을 수 있습니다.

관련 정보