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