나는 큰 것을 가지고 있습니다 gtf
. 여기에 eg.gtf
다음과 같이 공유합니다 .
chr22 Cufflinks transcript 10695955 10696708 . + . transcript_id "first_11345700"; gene_id "XLOC_158970"; gene_name "XLOC_158970"; oId "TCONS_00353198"; class_code "u"; tss_id "TSS369767"; original_gene_id "XLOC_158970";
chr22 Cufflinks exon 10702915 10703826 . + . transcript_id "first_11345701"; gene_id "ENSG00000277248.1"; gene_name "ENSG00000277248.1"; exon_number "1"; original_gene_id "ENSG00000277248.1";
chr22 Cufflinks transcript 10702915 10707278 . + . transcript_id "first_11345701"; gene_id "ENSG00000277248.1"; gene_name "ENSG00000277248.1"; oId "TCONS_00353199"; class_code "u"; tss_id "TSS369769"; original_gene_id "ENSG00000277248.1";
awk
다음과 같은 열 번호를 사용하여 필수 필드를 추출했습니다 .
cat eg.gtf | awk 'OFS="\t" {if ($3=="transcript") {print $1,$4-1,$5,$12,$7}}' | tr -d '";'
출력은 다음과 같습니다.
chr22 10695954 10696708 XLOC_158970 +
chr22 10702914 10707278 ENSG00000277248.1 +
12
명령에 열 번호를 사용하고 싶지 않지만 awk
이름이 있는 필드를 추출하고 싶습니다.
노트: 12th column has different names, starting with E or X or M or N or S
.
12
명령에 열 번호를 제공하지 않고 어떻게 12번째 필드를 얻을 수 있습니까 awk
? gene_id
열 11의 용어를 사용하여 필드 12를 가져오는 방법이 있습니까 ?
답변1
모든 Unix 시스템의 모든 쉘에서 awk를 사용하십시오.
$ cat tst.awk
BEGIN {
FS=OFS="\t"
}
$3 == "transcript" {
n = split($NF,tmp,/[; "]+/)
for ( i=1; i<n; i+=2 ) {
vals[tmp[i]] = tmp[i+1]
}
print $1, $4-1, $5, vals["gene_id"], $7
}
$ awk -f tst.awk file
chr22 10695954 10696708 XLOC_158970 +
chr22 10702914 10707278 ENSG00000277248.1 +
답변2
GTF는 탭으로 구분된 형식이므로 하위 필드의 순서를 신뢰할 수 없습니다. 대신 텍스트 구문 분석을 사용해야 합니다. 나는 Perl을 사용하여 다음을 수행합니다.
$ perl -F'\t' -lane '
if($F[2] eq "transcript"){
$gene_id = /gene_id\s*"([^"]+)"/ ? $1 : "None";
print join("\t",$F[0],$F[3]-1,$F[4],$gene_id,$F[6])
}' file
chr22 10695954 10696708 XLOC_158970 +
chr22 10702914 10707278 ENSG00000277248.1 +
이는 유전자 이름이 없는 경우 "없음"으로 인쇄하는 이점이 있습니다(예: 비코딩 전사체에는 유전자 이름이 없거나 알 수 없는 전사체 등이 있을 수 있음).
답변3
사용밀러( ) 또한 입력이 탭으로 구분된 파일이고 9번째 필드가 --구분된 키-값 필드로 구성되어 있다고 가정합니다 mlr
(키는 큰따옴표로 묶인 값 문자열에서 공백으로 구분됩니다).;
mlr --inidx --ifs tab --otsv --headerless-csv-output \
filter '$3 == "transcript"' then \
put '$4 -= 1; $9 = gsub($9, "; ", ";"); $9 = gsub($9, "\"", "")' then \
nest --explode --pairs --across-fields --nested-fs ';' --nested-ps ' ' -f 9 then \
cut -o -f 1,4,5,gene_id,7 file.gtf
이는 파일을 정수 인덱스 탭으로 구분된 필드로 읽고 헤더 없는 탭으로 구분된 데이터 출력(TSV)을 생성합니다. Miller가 삽입된 따옴표에 대해 불평하기 때문에 데이터를 TSV로 읽을 수 없습니다(필드 자체가 인용되지 않은 경우 필드에 따옴표를 삽입할 수 없습니다).
filter
세 번째 필드가 문자열이 아닌 모든 레코드를 삭제하는 것으로 처리가 시작됩니다 transcript
.
그런 다음 put
를 사용하여 네 번째 필드의 값을 1씩 줄여 조정합니다. 또한 ;
9번째 필드(추가 설명이 있는 필드)의 각 필드 뒤의 공백과 모든 필드의 큰따옴표를 제거했습니다 .
이 nest --explode
작업은 새로운명명 된키-값 쌍을 "폭발"하여 필드 9의 데이터에서 필드를 추출합니다.
cut
그런 다음 해당 필드를 포함하여 원하는 필드를 추출하는 데 사용할 수 있습니다 gene_id
.
질문의 데이터를 출력합니다.
chr22 10695954 10696708 XLOC_158970 +
chr22 10702914 10707278 ENSG00000277248.1 +