나는 큰 것을 가지고있다GTF 파일,다음과 같습니다:
# ./stringtie -p 4 -G /home/humangenome_hg19/homo_gtf_file.gtf -o strAD1_as/transcripts.gtf -l strAD1 /home/software/star-2.5.2b/bin/Linux_x86_64/mapA1Aligned.sortedByCoord.out.bam
# StringTie version 1.3.2d
1 StringTie transcript 30267 31109 1000 + . gene_id "strAD1.1"; transcript_id "strAD1.1.1"; reference_id "ENST00000469289"; ref_gene_id "ENSG00000243485"; ref_gene_name "MIR1302-10"; cov "0.028725"; FPKM "0.053510"; TPM "0.109957";
1 StringTie exon 30267 30667 1000 + . gene_id "strAD1.1"; transcript_id "strAD1.1.1"; exon_number "1"; reference_id "ENST00000469289"; ref_gene_id "ENSG00000243485"; ref_gene_name "MIR1302-10"; cov "0.014218";
1 StringTie exon 30976 31109 1000 + . gene_id "strAD1.1"; transcript_id "strAD1.1.1"; exon_number "2"; reference_id "ENST00000469289"; ref_gene_id "ENSG00000243485"; ref_gene_name "MIR1302-10"; cov "0.072139";
gene_id
9열에는 , transcript_id
및 reference_id
만 포함하고 싶습니다 ref_gene_id
. 열 9에 있으며 공백으로 구분됩니다(열 자체는 탭으로 구분됩니다). 간단한 명령을 사용하여 Linux에서 이러한 열을 만드는 방법을 알려줄 수 있습니까? 나는 엑셀을 사용하고 싶지 않다.
답변1
이상적으로는 데이터가 GTF 형식이므로 GTF 파서를 사용하여 구문 분석해야 합니다. 현재 그러한 파서나 파싱 라이브러리가 설치되어 있지 않으므로 내 솔루션은 귀하가 질문에 제공한 데이터만을 기반으로 합니다.
열 9를 추출하려면 다음을 수행합니다.
$ cut -f 9 data.gtf
gene_id "strAD1.1"; transcript_id "strAD1.1.1"; reference_id "ENST00000469289"; ref_gene_id "ENSG00000243485"; ref_gene_name "MIR1302-10"; cov "0.028725"; FPKM "0.053510"; TPM "0.109957";
gene_id "strAD1.1"; transcript_id "strAD1.1.1"; exon_number "1"; reference_id "ENST00000469289"; ref_gene_id "ENSG00000243485"; ref_gene_name "MIR1302-10"; cov "0.014218";
gene_id "strAD1.1"; transcript_id "strAD1.1.1"; exon_number "2"; reference_id "ENST00000469289"; ref_gene_id "ENSG00000243485"; ref_gene_name "MIR1302-10"; cov "0.072139";
여기서 원하는 데이터를 얻으려면 전사물과 엑손의 속성이 데이터에서 다른 순서로 되어 있으므로 별도로 처리해야 합니다. 이를 수행 awk
하고 현재 행에 문자열이 포함되어 있는지 여부에 따라 입력 데이터와 다른 필드를 출력합니다 exon_number
.
$ cut -f 9 data.gtf | awk '/exon_number/ { print $2, $4, $8, $10; next } { print $2, $4, $6, $8 }'
"strAD1.1"; "strAD1.1.1"; "ENST00000469289"; "ENSG00000243485";
"strAD1.1"; "strAD1.1.1"; "ENST00000469289"; "ENSG00000243485";
"strAD1.1"; "strAD1.1.1"; "ENST00000469289"; "ENSG00000243485";
그런 다음 큰따옴표와 세미콜론을 제거합니다.
$ cut -f 9 data.gtf | awk '/exon_number/ { print $2, $4, $8, $10; next } { print $2, $4, $6, $8 }' | tr -d '";'
strAD1.1 strAD1.1.1 ENST00000469289 ENSG00000243485
strAD1.1 strAD1.1.1 ENST00000469289 ENSG00000243485
strAD1.1 strAD1.1.1 ENST00000469289 ENSG00000243485
답변2
어쩌면 그냥:
< file cut -sd '"' -f2,4,8,10 | tr '"' ' '
즉, 입력을 "
분리된 열 목록으로 처리하고 열 2 , 4 , 8 및 10 을 추출 합니다 .
GNU를 사용 cut
하면 .| tr '"' ' '
--output-delimiter=' '
이는 "
문자가 행의 다른 곳에 나타나지 않고 해당 gene_id
, transcript_id
... 속성이 항상 해당 순서로 나타나고 항상 나타난다고 가정합니다.
Kusalananda가 지적했듯이, 귀하의 예에서는 그렇지 않습니다. 2,4,6,8
첫 번째 줄과 2,4,8,10
다른 줄은 다음과 같아야 합니다.
보다 표현력 있는 일치를 만들려면 탭 으로 구분된 9번째 열만 고려하여 올바른 속성 이름을 찾아야 합니다. 정규식을 사용할 수 있습니다. 예를 들면 다음과 같습니다.
< file pcregrep -o1 -o2 -o3 -o4 --om-separator=' ' '(?x)
^(?:[^\t]*+\t){8}(?=[^\t]*? \b gene_id \ +"([^"\t]*)")
(?=[^\t]*? \b transcript_id \ +"([^"\t]*)")
(?=[^\t]*? \b reference_id \ +"([^"\t]*)")
(?=[^\t]*? \b ref_gene_id \ +"([^"\t]*)")'
해당 버전이 없거나 pcregrep
버전이 너무 오래되어 지원할 수 없는 경우 -o1...
다음을 사용할 수 있습니다 perl
.
< file perl -lne 'print "$1 $2 $3 $4" if m{
^(?:[^\t]*+\t){8}(?=[^\t]*? \b gene_id \ +"([^"\t]*)")
(?=[^\t]*? \b transcript_id \ +"([^"\t]*)")
(?=[^\t]*? \b reference_id \ +"([^"\t]*)")
(?=[^\t]*? \b ref_gene_id \ +"([^"\t]*)")}x'
이 정규식은 먼저 처음 8개 필드( (?:[^\t]*+\t){8}
)와 일치한 다음 4개의 예측 표현식( )이 있으므로 (?=...)
다음 내용이 4개의 예측 표현식과 모두 일치하는 경우 해당 8개 필드를 일치시킵니다. 각 예측 표현식은 속성 중 하나를 찾고 값을 캡처합니다( 위젯에서 (...)
). 이렇게 캡처된 값은 $1
, $2
, , 에서 $3
사용될 수 있습니다 $4
.
이를 통해 속성을 어떤 순서로든 정렬할 수 있습니다.
다음과 같은 방법으로 속일 수 있습니다.
1 2 3 4 5 6 7 8 gene_id "transcript_id " ...
이 문제를 해결할 수는 있지만 입력에 표시될 것이라고는 기대하지 않으므로 노력할 가치가 없을 것입니다.
를 사용하면 9번째 필드perl
에 대한 보다 공식적인 구문 분석을 수행 할 수도 있습니다. 그것은 다음과 같습니다:
< file perl -F'\t' -lane '
my %field;
while ($F[8] =~ /(\w+) +"(.*?)"/g) {$field{$1}=$2}
if (%field) {
print join " ", @field{
qw(gene_id transcript_id reference_id ref_gene_id
)}
}'
(여기서는 하나 이상의 속성이 발견될 때마다 한 줄이 인쇄됩니다(다른 메서드에서 요청된 모든 속성과 반대).