두 개의 파일이 있습니다.
파일 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]