Como alterar uma coluna em uma linha em um arquivo de texto delimitado por tabulação se ela for duplicada

2

Digamos que eu tenha essas muitas linhas

chr1    66999638    66999638    SGIP1   1   +
chr1    66999251    66999251    SGIP1   1   +
chr1    33545778    33549778    AZIN2   1   +
chr1    8376144 8380144 SLC45A1 1   +
chr1    16765166    16769166    NECAP2  1   +
chr1    33544713    33548713    AZIN2   1   +
chr1    25069759    25073759    CLIC4   1   +
chr1    33544729    33548729    AZIN2   1   +
chr1    50487626    50491626    AGBL4   1   -
chr1    92349836    92353836    TGFBR3  1   -

Resultado esperado:

chr1    66999638    66999638    SGIP1   1   +
chr1    66999251    66999251    SGIP1_1 1   +
chr1    33545778    33549778    AZIN2   1   +
chr1    83761448380144  SLC45A1 1   +
chr1    16765166    16769166    NECAP2  1   +
chr1    33544713    33548713    AZIN2_1 1   +
chr1    25069759    25073759    CLIC4   1   +
chr1    33544729    33548729    AZIN2_2 1   +
chr1    50487626    50491626    AGBL4   1   -
chr1    92349836    92353836    TGFBR3  1   -

Eu gostaria de uma maneira de alterar a segunda linha (e 3ª, 4ª, etc.) que é duplicada na coluna $ 4. Eu simplesmente quero adicionar uma string "_1" para que ela seja "SGIP_1" ou "WhateverGeneName_1".

De preferência, uma solução awk ou sed seria melhor. Muito obrigado antecipadamente.

    
por System 12.01.2016 / 15:21

2 respostas

2

No caso mais simples em que você deseja que todos os nomes dos genes tenham _N anexado, mesmo que eles apareçam apenas uma vez, você pode fazer:

$ awk '$4=$4"_"++a[$4];' file.gff 
chr1 66999638 66999638 SGIP1_1 1 +
chr1 66999251 66999251 SGIP1_2 1 +
chr1 33545778 33549778 AZIN2_1 1 +
chr1 8376144 8380144 SLC45A1_1 1 +
chr1 16765166 16769166 NECAP2_1 1 +
chr1 33544713 33548713 AZIN2_2 1 +
chr1 25069759 25073759 CLIC4_1 1 +
chr1 33544729 33548729 AZIN2_3 1 +
chr1 50487626 50491626 AGBL4_1 1 -
chr1 92349836 92353836 TGFBR3_1 1 -

Observe que isso alterará o separador de campo para um único espaço. Para mantê-lo separado por tabulação (como os arquivos GFF devem ser), use:

$ awk -vOFS="\t" '$4=$4"_"++a[$4];' file.gff 
chr1    66999638    66999638    SGIP1_1 1   +
chr1    66999251    66999251    SGIP1_2 1   +
chr1    33545778    33549778    AZIN2_1 1   +
chr1    8376144 8380144 SLC45A1_1   1   +
chr1    16765166    16769166    NECAP2_1    1   +
chr1    33544713    33548713    AZIN2_2 1   +
chr1    25069759    25073759    CLIC4_1 1   +
chr1    33544729    33548729    AZIN2_3 1   +
chr1    50487626    50491626    AGBL4_1 1   -
chr1    92349836    92353836    TGFBR3_1    1   -

Se você quiser modificar apenas os nomes dos genes que aparecem mais de uma vez, fica um pouco mais complexo:

$ awk -vOFS="\t" '(++a[$4]>1){$4=$4"_"a[$4]-1}1;' file.gff
chr1    66999638    66999638    SGIP1   1   +
chr1    66999251    66999251    SGIP1_1 1   +
chr1    33545778    33549778    AZIN2   1   +
chr1    8376144 8380144 SLC45A1 1   +
chr1    16765166    16769166    NECAP2  1   +
chr1    33544713    33548713    AZIN2_1 1   +
chr1    25069759    25073759    CLIC4   1   +
chr1    33544729    33548729    AZIN2_2 1   +
chr1    50487626    50491626    AGBL4   1   -
chr1    92349836    92353836    TGFBR3  1   -
    
por 12.01.2016 / 15:56
1

Usando o awk

awk -vOFS="\t" '{$4=a[$4]++?$4"_"a[$4]-1:$4}1' file

chr1    66999638        66999638        SGIP1   1       +
chr1    66999251        66999251        SGIP1_1 1       +
chr1    33545778        33549778        AZIN2   1       +
chr1    8376144 8380144 SLC45A1 1       +
chr1    16765166        16769166        NECAP2  1       +
chr1    33544713        33548713        AZIN2_1 1       +
chr1    25069759        25073759        CLIC4   1       +
chr1    33544729        33548729        AZIN2_2 1       +
chr1    50487626        50491626        AGBL4   1       -
chr1    92349836        92353836        TGFBR3  1       -

Define $ 4 para se igualar se apenas uma ocorrência foi vista ou adiciona _ , em seguida, o número de ocorrências visto menos 1.

    
por 12.01.2016 / 15:53