아래와 같은 파일(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]
}