고정되지 않은 간격의 정의된 길이를 기반으로 시작 및 끝 좌표 추출

고정되지 않은 간격의 정의된 길이를 기반으로 시작 및 끝 좌표 추출

"시작" 열에서 시작하여 "끝" 열로 끝나는 간격이 있는 파일이 있습니다. 네 번째 열에 기록된 정의된 길이를 기반으로 이러한 간격의 시작과 끝을 추출해야 합니다. 또한 "점수" 열에 있는 정보를 인쇄해야 합니다. 파일은 다음과 같습니다.

Input:  
chr     start   end     score  length  
chr1    237592  237601  176    320
chr1    237601  237912  176    320
chr1    521409  521601  150    320  
chr1    521601  521729  150    320
chr1    714026  714346  83     320 
chr1    805100  805201  323    340
chr1    805201  805440  323    340


Output:
chr     start   end     score  length  
chr1    237592  237912  176    320
chr1    521409  521729  150    320 
chr1    714026  714346  83     320
chr1    805100  805440  323    340 

보시다시피 추출할 간격의 길이는 다섯 번째 열에 있습니다. 예를 들어 간격의 길이를 출력합니다.

chr1    237592  237912

이는 237912("To" 열의 두 번째 행)에서 237592("Start" 열의 첫 번째 행)를 빼서 구하며, 이는 320(열 5에 정의됨)입니다.

어떤 아이디어라도 대단히 감사하겠습니다.

답변1

느슨하게 말하면 문제는 병합 라인입니다. 선의 시작 좌표가 이전 선의 끝 좌표와 동일한 경우 선은 이전 선과 "병합"될 수 있습니다.

이 라인은 게놈 특징에 해당할 수 있습니다. 목표는 게놈 서열에서 인접한 특징을 병합하는 것입니다.

awk이 작업을 수행하는 스크립트 는 다음과 같습니다 .

$2 == end {
    # This line merges with the previous line.
    # Update end and continue with next line.

    end = $3;
    next;
}

{
    # This is an unmergeable line (start doesn't correspond to end on
    # previous line).

    # If we've processed at least the header line, print the data collected.
    # The if statement avoids printing an empty output line at the 
    # start of the output.

    if (NR > 1) {
        print chr, start, end, score, len;
    }

    # Get data from this line.

    chr = $1;
    start = $2;
    end = $3;
    score = $4;
    len = $5;
}

END {
    # At the end of input, print the data as above to output last line.
    print chr, start, end, score, len;
}

스크립트는 입력이 정렬되어 있고 모든 시작 좌표가 끝 좌표보다 엄격히 작다고 가정합니다(즉, 모든 기능이 양수 체인에 있음).

테스트해보세요:

$ awk -f script.awk data
chr start end score length
chr1 237592 237912 176 320
chr1 521409 521729 150 320
chr1 714026 714346 83 320
chr1 805100 805440 323 340

답변2

나에게 이것은 공백으로 구분된 열이 있는 텍스트 파일처럼 보입니다. 이는 정상적으로 처리될 수 있지만 R쉘 스크립트도 이를 수행할 수 있습니다. 필요한 것은 루프를 사용하여 파일을 한 줄씩 읽는 것입니다 for. 루프에서 간단한 접근 방식은 cut각 열 값(사용할 수 있음)을 변수에 할당한 다음 원하는 순서대로 변수를 인쇄하는 것입니다. 두 번째와 다섯 번째 열 변수가 함께 추가되어 세 번째 출력 열이 생성됩니다. echofor 루프를 사용하여 각 출력 줄을 화면에 인쇄 할 수 있습니다 . 화면에 원하는 줄이 인쇄되면 간단히 스크립트 출력을 다음과 같은 파일로 리디렉션할 수 있습니다.your_script.sh > your new output.txt

관련 정보