범위가 가장 큰 행 유지

범위가 가장 큰 행 유지

아래와 같은 파일(fileA)이 있습니다.

>ENST00000614578.1 gene=WASP12 CDS=1-526
>ENST00000581055.1 gene=PTP2 CDS=138-579
>ENST00000577541.1 gene=PTP2 CDS=1-81
>ENST00000423485.5 gene=PTP2 CDS=160-4752
>ENST00000367142.4 gene=PRPF40B CDS=304-1032
>ENST00000366955.7 gene=WASP12 CDS=169-9511

CDS 값의 범위가 가장 큰 행만 유지하고 싶습니다. 범위는 세 번째 열의 CDS 값으로 지정됩니다. 예를 들어 첫 번째 행의 범위는 525(526-1)이고 두 번째 행의 범위는 441(579-138)입니다.

원하는 출력:

>ENST00000423485.5 gene=PTP2 CDS=160-4752
>ENST00000367142.4 gene=PRPF40B CDS=304-1032
>ENST00000366955.7 gene=WASP12 CDS=169-9511

정렬을 해보았습니다.

sort -nrk3,3  fileA 

하지만 저는 이것이 갈 길이 아니라고 생각합니다. 어떤 제안이라도 있습니까? 필터링 기준은 동일한 유전자 이름을 가진 행에 대한 범위의 최대값을 취하는 것입니다.

답변1

새로운 정보를 보고 여기에 왔습니다

awk -F'[ =-]' '{ print $0" "$6-$5 | "sort -k4nr" }' fileA | \
cut -d' ' -f1-3 | \
awk -F'[ =]' '!seen[$3]++'

산출:

>ENST00000366955.7 gene=WASP12 CDS=169-9511
>ENST00000423485.5 gene=PTP2 CDS=160-4752
>ENST00000367142.4 gene=PRPF40B CDS=304-1032

이것은 확실히 하나의 명령으로 수행할 수 있지만 awk아직 사용 방법을 배우는 중입니다.



OP 편집 전의 이전 답변:

최소값이 700(예제 출력과 일치하도록)이라고 가정하면 다음을 시도해 볼 수 있습니다.

awk -F'[=-]' '$4-$3 > 700' fileA

산출:

>ENST00000423485.5 gene=PTP2 CDS=160-4752
>ENST00000367142.4 gene=PRPF40B CDS=304-1032
>ENST00000366955.7 gene=WASP12 CDS=169-9511

-F'[=-]': =및 를 -열 구분 기호로 사용하여 열 3과 4가 됩니다.

1 526
138 579
1 81
160 4752
304 1032
169 9511

$4-$3 > 700: 4번째 열에서 3번째 열을 뺀 값이 700보다 큰 행을 선택합니다.

답변2

범위는 항상 정방향 체인에서 렌더링되고 절대 반대 방향으로 렌더링되지 않으며 원본 파일의 열이 단일 공백으로 구분된다고 가정하면,

$ awk -F '[ =-]' '{ k = $3; r = $6 - $5 } (m[k] == "" || m[k] < r) { d[k] = $0; m[k] = r } END { for (k in d) print d[k] }' file
>ENST00000366955.7 gene=WASP12 CDS=169-9511
>ENST00000367142.4 gene=PRPF40B CDS=304-1032
>ENST00000423485.5 gene=PTP2 CDS=160-4752

이는 데이터를 =공백과 로 구분된 필드가 있는 행 으로 처리합니다 -. 따라서 범위의 길이는 6번째 필드에서 5번째 필드를 빼면 구할 수 있습니다. 모든 유전자 이름의 최대 범위는 m("max") 배열에 저장되고 해당 행은 d("data") 배열에 저장됩니다.

마지막으로 수집된 데이터 d가 출력됩니다.

awk더 나은 형식의 코드:

BEGIN { FS = "[ =-]" }

{
    k = $3
    r = $6 - $5
}

(m[k] == "" || m[k] < r) {
    d[k] = $0
    m[k] = r
}

END {
    for (k in d) print d[k]
}

관련 정보