별도의 파일에 지정된 범위를 기반으로 여러 열 행을 선택합니다.

별도의 파일에 지정된 범위를 기반으로 여러 열 행을 선택합니다.

두 개의 파일이 있습니다.

파일 1

ST4.03ch10 56000001 56500000
ST4.03ch11 34500001 35000000
ST4.03ch04 54500001 55000000
ST4.03ch12 500001 1000000

파일 2

ST4.03ch12 56014301 56019800 0.163 유전자 5.5
ST4.03ch12 56022401 56025300 0.419 유전자 2.9
ST4.03ch12 671201 803500 1 유전자 5.5 ST4.03ch12 671201 8035
00 1 유전자 5.3 ST4.03ch12 671201 803500
1 유전자 5.0
ST4.03ch12 447401 449500 0.038 유전자 8.5
ST4 . 03ch12 671201 803500 1 유전자 9.5

편집: 이전 예제 데이터를 기반으로 생성된 코드가 실제 데이터와 잘 작동하지 않으므로 여기에 실제 데이터 중 일부를 추가했습니다.

다음 세 가지 기준에 따라 file1의 줄 중 하나와 일치하는 file2의 줄을 선택하고 인쇄하려고 합니다.

1. col1 of file2 = col1 of file1;  
2. col2 of file2 >/= col2 of file1, and  
3. col3 of file2 </= col3 of file1

내가 하고 싶은 일은: 파일 1의 col1에 식별자(ST4.03chXX)가 포함되어 있고 col2(시작) 및 col3(끝)에 해당 조정 범위가 포함되어 있으며 파일 2에서 항목을 찾고 있습니다.
1) 식별자 colA의
시작 및 끝 좌표(colB 및 colC)가 파일 1의 해당 식별자 범위 내에 있는 파일 1 및 2의 식별자와 일치합니다.

예상 출력:

ST4.03ch12 671201 803500 1 유전자 5.5
ST4.03ch12 671201 803500 1 유전자 5.3
ST4.03ch12 671201 803500 1 유전자 5.0
ST4.03ch12 671201 803500 1 유전자 9.5

실제 파일(특히 파일 2)은 상당히 크기 때문에 a를 사용하여 작업을 완료하고 싶지만 awk필요한 경우 루프가 작동합니다.

답변1

다음과 같이 시도해 볼 수 있습니다.

awk 'NR==FNR{z[$1]?z[$1]=z[$1]"|"$2"|"$3:z[$1]=$2"|"$3;next}
{if ($1 in z){l=split(z[$1], k, "|");
{for (i=1;i<l;i+=2){if ($2>=k[i] && $3<=k[i+1]){print}}}}}' file1 file2

이는 를 읽고 file1, 두 번째와 세 번째 필드를 a로 연결 |하고 이를 배열 z(첫 번째 필드로 인덱싱됨)에 저장한 다음 file2첫 번째 필드가 있는지 읽고 확인합니다. z만약 그렇다면 z[1st field]줄을 분할 |하여 인쇄 k[i]합니다. i필드 2 >=k[i]와 필드 3 인 경우 각 홀수 값<=k[i+1]

관련 정보