쉘 스크립트를 사용하여 다른 파일의 숫자가 범위 내에 있는지 확인하고 해당 일치에 대한 모든 정보를 출력합니다.

쉘 스크립트를 사용하여 다른 파일의 숫자가 범위 내에 있는지 확인하고 해당 일치에 대한 모든 정보를 출력합니다.

두 개의 입력 파일이 있습니다

File A

chr1    1167639 0
chrX    114868305   14
chr1    1167653 0
chr11   62389325    2
chr9    140127768   17

File B

chr10   73082492    73082831 SLC29A3
chr11   46332562    46332760 CREB3L1
chr11   62389317    62389439 B3GAT3
chrX    22056566    22056675 PHEX
chrX    114868291   114868413 PLS3

이것이 내가 원하는 출력이다

chrX    114868305   14 chrX    114868291   114868413   PLS3
chr11   62389325    2  chr11   62389317    62389439    B3GAT3

내가 원하는 것은 파일 B의 열 1에서 파일 A의 열 1 요소를 찾는 것입니다. 문자열이 동일한 경우 파일 A의 2번째 열 번호를 가져와 파일 B의 2번째 열과 3번째 열 사이의 파일 B 번호 범위에 포함되는지 확인합니다. 포함된 경우 파일 A와 파일 B의 행을 출력의 한 행에 인쇄합니다.

답변1

$ cat tst.awk
BEGIN { OFS="\t" }
NR==FNR {
    ++cnt[$1]
    beg[$1,cnt[$1]] = $2
    end[$1,cnt[$1]] = $3
    val[$1,cnt[$1]] = $0
    next
}
$1 in cnt {
    for (i=1; i<=cnt[$1]; i++) {
        if ( (beg[$1,i] <= $2) && ($2 <= end[$1,i]) ) {
            print $0, val[$1,i]
        }
    }
}

$ awk -f tst.awk fileB fileA
chrX    114868305   14  chrX    114868291   114868413 PLS3
chr11   62389325    2   chr11   62389317    62389439 B3GAT3

위의 내용은 탭으로 구분된 출력을 원한다고 가정합니다. 그렇지 않으면 제거하고 BEGIN { OFS="\t" }, 시각적으로 테이블로 표시하려면 파이프로 연결합니다 column -t.

관련 정보