manter apenas determinada parte de uma string em uma determinada coluna

1

Eu tenho um arquivo como este:

id  target_id                               length  eff_length
1   intron_FBgn0000721:20_FBgn0000721:18    1136    243.944268
1   intron_FBgn0000721:19_FBgn0000721:18    1122    240.237419
2   intron_FBgn0264373:2_FBgn0264373:3      56      0
3   intron_FBgn0027570:4_FBgn0027570:3      54      0

Para a segunda coluna target_id , desejo manter apenas a string (nem sempre FBgnXXXX , às vezes outros nomes) entre intron_ e o primeiro : . Portanto, o novo arquivo de saída terá o valor mais simples para a coluna 2, mas o restante do arquivo permanecerá o mesmo.

Eu tentei com o comando sed, mas não sei como excluir a parte que não preciso.

    
por Karli 07.10.2014 / 08:04

3 respostas

6

Usando sed e column :

$ sed -E 's/ intron_([^:]*):[^[:space:]]*/ /' file | column -t
id  target_id    length  eff_length
1   FBgn0000721  1136    243.944268
1   FBgn0000721  1122    240.237419
2   FBgn0264373  56      0

A parte principal disso é o comando substituto:

s/ intron_([^:]*):\S*/ /

Ele procura intron_ e salva tudo depois de intron_ e antes dos primeiros dois pontos na variável 1 . [^[:space:]]* corresponde tudo, desde o cólon até o final do campo. Tudo isso é substituído pelo texto salvo na variável 1 .

Usando awk com saída separada por tabulação:

$ awk -v "OFS=\t" '{$2=$2;sub(/intron_/, "", $2); sub(/:.*/, "", $2); print}' file
id      target_id       length  eff_length
1       FBgn0000721     1136    243.944268
1       FBgn0000721     1122    240.237419
2       FBgn0264373     56      0

Explicação:

  • -v "OFS=\t"

    Isso define o separador de campo de saída como uma guia. Isso ajuda a alinhar as colunas, possivelmente tornando column desnecessário.

  • $2=$2

    Ao imprimir uma linha, awk não será alterado para nosso separador de campos de saída recém-especificado, a menos que alteremos algo na linha. Atribuir o segundo campo ao segundo campo é suficiente para garantir que a saída tenha tabulações.

  • sub(/intron_/, "", $2)

    Isso remove intron_ do segundo campo.

  • sub(/:.*/, "", $2)

    Isso remove tudo após os dois primeiros pontos do segundo campo.

  • print

    Isso imprime nossa nova linha.

Usando awk com formatação de coluna personalizada

É como o acima, mas usa printf para que possamos formatar as larguras e alinhamentos de colunas como desejar:

$ awk  '{sub(/intron_/, "", $2); sub(/:.*/, "", $2); printf "%-3s %-12s %8s %3s\n",$1,$2,$3,$4}' file
id  target_id      length eff_length
1   FBgn0000721      1136 243.944268
1   FBgn0000721      1122 240.237419
2   FBgn0264373        56   0

Aqui, a instrução printf "%-3s %-12s %8s %3s\n",$1,$2,$3,$4 seleciona as larguras e alinhamentos da coluna no estilo usual printf .

Usando sed e convertendo de separado por tabulação para separado por vírgula

$ sed -E 's/ intron_([^:]*):[^[:space:]]*/ /; s/[[:space:]][[:space:]]*/,/g' file 
id,target_id,length,eff_length
1,FBgn0000721,1136,243.944268
1,FBgn0000721,1122,240.237419
2,FBgn0264373,56,0
    
por 07.10.2014 / 08:14
1

Você pode usar perl :

$ perl -anle '
    BEGIN {$" = "\t"}
    print "@{[@F]}" and next if $. == 1;
    $F[1] = $1 if /_([^:]*):/;
    print "@{[@F]}";
' file
id  target_id   length  eff_length
1   FBgn0000721 1136    243.944268
1   FBgn0000721 1122    240.237419
2   FBgn0264373 56      0
3   FBgn0027570 54      0

Explicação

  • -a : divide automaticamente cada linha no array @F .

  • BEGIN {$" = "\t"} : nós definimos o separador de lista para a guia \t , ele é usado quando uma matriz ou fatia de matriz é interpolada na sequência de aspas duplas.

  • print "@{[@F]}" and next if $. == 1 : Imprimimos o cabeçalho, processamos para a próxima linha.

  • $F[1] = $1 if /_([^:]*):/ : obtemos o valor entre _ e primeiro : , salve-o no segundo elemento em @F .

  • print "@{[@F]}" : imprima apenas o resultado desejado.

por 07.10.2014 / 08:16
0
sed -e 'h;s/.*intron_[^:]*\(:[^[:space:]]*\).*//;s/./ /g;;G;;s/\(.*\)\n\(.*\)intron_\([^:]*\):[^[:space:]]*//' YourFile

Em 1 sed (sem tubo) mantendo a coluna. Ele usa o buffer de retenção

Versão Posix (então --posix no GNU sed)

    
por 07.10.2014 / 10:34