como eu adiciono caracteres a linhas que não os têm

1

A primeira linha dos meus dados parece

scaffold10x_1   AUGUSTUS    gene    3591    3908    0.61    -   .   g1
scaffold10x_1   AUGUSTUS    transcript  3591    3908    0.61    -   .   g1.t1
scaffold10x_1   AUGUSTUS    stop_codon  3591    3593    .   -   0   transcript_id "g1.t1"; gene_id "g1";
scaffold10x_1   AUGUSTUS    CDS 3591    3908    0.61    -   0   transcript_id "g1.t1"; gene_id "g1";
scaffold10x_1   AUGUSTUS    exon    3591    3908    .   -   .   transcript_id "g1.t1"; gene_id "g1";
scaffold10x_1   AUGUSTUS    start_codon 3906    3908    .   -   0   transcript_id "g1.t1"; gene_id "g1";

Eu preciso adicionar "; às linhas nas últimas colunas que não têm. Eu já usei grep -v transcript_id canada.gtf | grep -v "^#" para identificar as linhas que não têm. Posso usar um comando do Linux para fazer isso?

    
por Kay NewEdge Daramola 19.12.2017 / 11:27

3 respostas

1

sed abordagem:

sed 's/[^[:space:]]\+[^;[:space:]]$/"&";/' file

A saída:

scaffold10x_1   AUGUSTUS    gene    3591    3908    0.61    -   .   "g1";
scaffold10x_1   AUGUSTUS    transcript  3591    3908    0.61    -   .   "g1.t1";
scaffold10x_1   AUGUSTUS    stop_codon  3591    3593    .   -   0   transcript_id "g1.t1"; gene_id "g1";
scaffold10x_1   AUGUSTUS    CDS 3591    3908    0.61    -   0   transcript_id "g1.t1"; gene_id "g1";
scaffold10x_1   AUGUSTUS    exon    3591    3908    .   -   .   transcript_id "g1.t1"; gene_id "g1";
scaffold10x_1   AUGUSTUS    start_codon 3906    3908    .   -   0   transcript_id "g1.t1"; gene_id "g1";
    
por 19.12.2017 / 11:42
0

Este comando sed fará com que cada linha termine em exatamente um ponto-e-vírgula e que a última palavra em cada linha seja citada:

sed -e 's/"\?\([a-z0-9.]\+\)"\?;*$/"";/' canada.gtf

Aqui está a saída deste comando:

scaffold10x_1   AUGUSTUS    gene    3591    3908    0.61    -   .   "g1";
scaffold10x_1   AUGUSTUS    transcript  3591    3908    0.61    -   .   "g1.t1";
scaffold10x_1   AUGUSTUS    stop_codon  3591    3593    .   -   0   transcript_id "g1.t1"; gene_id "g1";
scaffold10x_1   AUGUSTUS    CDS 3591    3908    0.61    -   0   transcript_id "g1.t1"; gene_id "g1";
scaffold10x_1   AUGUSTUS    exon    3591    3908    .   -   .   transcript_id "g1.t1"; gene_id "g1";
scaffold10x_1   AUGUSTUS    start_codon 3906    3908    .   -   0   transcript_id "g1.t1"; gene_id "g1";

Se você quiser modificar o arquivo no local, use o sinalizador -i :

sed -i -e 's/"\?\([a-z0-9.]\+\)"\?;*$/"";/' canada.gtf

Se você quiser apenas certificar-se de que cada linha termine com "; (e você não deseja uma correspondência " no início da última palavra na linha), poderá usar o seguinte comando:

sed -e 's/"\?;\?$/";/' canada.gtf

E aqui está a saída deste comando:

scaffold10x_1   AUGUSTUS    gene    3591    3908    0.61    -   .   g1";
scaffold10x_1   AUGUSTUS    transcript  3591    3908    0.61    -   .   g1.t1";
scaffold10x_1   AUGUSTUS    stop_codon  3591    3593    .   -   0   transcript_id "g1.t1"; gene_id "g1";
scaffold10x_1   AUGUSTUS    CDS 3591    3908    0.61    -   0   transcript_id "g1.t1"; gene_id "g1";
scaffold10x_1   AUGUSTUS    exon    3591    3908    .   -   .   transcript_id "g1.t1"; gene_id "g1";
scaffold10x_1   AUGUSTUS    start_codon 3906    3908    .   -   0   transcript_id "g1.t1"; gene_id "g1";
    
por 19.12.2017 / 11:36
0

@Kay NewEdge Daramola

Usando abaixo o oneliner eu consegui o resultado

Código:

sed  's/[a-z][0-9]$/&";/g' example.txt |sed 's/[a-z][0-9].\{2\}/"&/g'

saída

scaffol"d10x_1   AUGUSTUS    gene    3591    3908    0.61    -   .   "g1";
scaffol"d10x_1   AUGUSTUS    transcript  3591    3908    0.61    -   .   "g1.t1";
scaffol"d10x_1   AUGUSTUS    stop_codon  3591    3593    .   -   0   transcript_id ""g1.t1"; gene_id ""g1";
scaffol"d10x_1   AUGUSTUS    CDS 3591    3908    0.61    -   0   transcript_id ""g1.t1"; gene_id ""g1";
scaffol"d10x_1   AUGUSTUS    exon    3591    3908    .   -   .   transcript_id ""g1.t1"; gene_id ""g1";
scaffol"d10x_1   AUGUSTUS    start_codon 3906    3908    .   -   0   transcript_id ""g1.t1"; gene_id ""g1";  
por 19.12.2017 / 16:40