숫자 범위에 속하는 경우 서로 다른 줄이 있는 2개의 파일을 비교합니다.

숫자 범위에 속하는 경우 서로 다른 줄이 있는 2개의 파일을 비교합니다.

줄이 다른 두 개의 파일이 있습니다. 파일 1에는 860줄이 있고 파일 2에는 650,000줄이 있습니다.

파일 1

chr  start    End    CM
1     0       2000   p3.5
1     2400    8000   p5.3
2     9500    20000  q2.4
3     0       3000   p7.6
4     60800  89000   p77.1 
8     12000    36000  q4.5
8     55000    78000  p22.4

파일 2

chr  pos
1     1500
2     10500
4     70000
8     13000

파일 1의 열 2와 열 3 사이에 있는 경우 파일 2의 각 항목을 비교하고 싶습니다(열 1도 확인해야 함(두 파일 모두의 문자)). 일치하면 그에 따라 열 1과 열 2를 인쇄해야 합니다. 파일 2와 파일 1의 열 4.

원하는 출력:

chr  pos     CM 
1     1500    p3.5
2     10500   q2.4
4     70000  p77.1
8     13000   q4.5

당신의 도움을 주셔서 감사합니다

답변1

가장 쉬운 방법은 정렬한 다음 정렬된 목록을 구문 분석하는 것 같습니다.

cat file1 file2 | 
     sort -k1,1n -k2,2n | 
     awk 'NF==4{c=$1; lo=$2; hi=$3; cm=$4} 
          NF==2 && c==$1 && lo<=$2 && hi>=$3{printf "%s\t%s\t%s\n", $1, $2, cm}'

숫자로 그리고 순차적으로 배열된 조합 cat목록을 생성합니다.sortchrpos

chr  pos
chr  start    End    CM
1     0       2000   p3.5
1     1500
1     2400    8000   p5.3
2     9500    20000  q2.4
2     10500
3     0       3000   p7.6
4     60800  89000   p77.1 
4     70000
8     12000    36000  q4.5
8     13000
8     55000    78000  p22.4

awk파일을 한 번 살펴보고 행에 도달할 chr때마다 , 및 의 새 값을 선택 lo하고 조건에 따라 해당 행만 테스트하십시오.hicmNF==4NF==2

1       1500    p3.5
2       10500   q2.4
4       70000   p77.1
8       13000   q4.5

및 650,000줄의 테스트 파일

real    0m1.511s
user    0m1.249s
sys     0m0.477s

관련 정보