파일 간 상호 참조 열

파일 간 상호 참조 열

이 작업을 수행할 수 있는 방법이 있을 것이라고 확신하지만 막혀서 도움을 드리고 싶습니다. 아래와 같이 두 개의 파일이 있습니다.

파일 1:

8750    11.29592283
8800    7.500359335
14150   3.281781819
23850   3.668931975
23900   14.69918465
23950   5.259260427
27300   3.374571119

파일 2:

hypothetical protein CDS                7152            7346            TK0006
hypothetical protein CDS                7399            7614            TK0007
DNA methylase CDS               7655            8755            TK0008
hypothetical protein CDS                8760            10093           TK0009
hypothetical protein CDS                10095           10379           TK0010
hypothetical protein CDS                10385           10807           TK0011

File1은 게놈 좌표 및 발현 값이고 File2는 게놈 주석입니다. 내가 필요한 것은 컬럼 1 파일 1의 값이 컬럼 2 파일 2와 컬럼 3 파일 3 사이에 있는 경우 각 파일의 전체 행을 반환하는 것입니다. 예를 들어, file1의 처음 두 줄은 다음 출력을 반환합니다.

8750    11.29592283    DNA methylase CDS               7655            8755            TK0008
8800    7.500359335    hypothetical protein CDS                8760            10093           TK0009

짧은 awk 명령이나 이와 유사한 명령을 사용하여 이러한 프로세스가 가능합니까? 아니면 내가 씹을 수 있는 것보다 더 많이 깨물고 있는 걸까?

감사해요! !

답변1

해결책:

awk -F'[[:space:]][[:space:]]+' 'NR==FNR{ a[$1]=$0; next }
     {  for(i in a) { 
            if (int(i) >= $2 && int(i) <= $3) { 
                print a[i],$0; delete a[i]; break 
            } 
        }
     }' File1 OFS='\t' File2

산출:

8750    11.29592283 DNA methylase CDS               7655            8755            TK0008
8800    7.500359335 hypothetical protein CDS                8760            10093           TK0009

  • -F'[[:space:]][[:space:]]+'- 필드 구분자를 정의하는 패턴

  • a[$1]=$0- 그것으로부터 핵심 가치를 얻는다File1

  • if (int(i) >= $2 && int(i) <= $3)- 첫 번째 필드 값이 File1범위(두 번째와 세 번째 필드 값 사이 File2) 내에 있는지 확인하세요.

  • delete a[i]- 일치하는 값 삭제

  • break- 중복 반복을 피하기 위해 루프 중단

관련 정보