Substituir valores na coluna que contêm números

2

Eu tenho um arquivo assim:

chrom   start   stop    strand  isoform mu_codon    mut_codon2  more_info
chr22   43089055    43089055    -   NM_017436   C   300 903delC
chr22   43089715    43089717    -   NM_017436   CTT 79  241_243delTTC
chr12   53701873    53701875    -   NM_015665   TTC A   1292_1294delTTCinsA

Eu quero substituir os valores na sétima coluna por um espaço se eles contiverem um número e não uma letra.

Por exemplo, aqui está minha saída desejada:

chrom   start   stop    strand  isoform mu_codon    mut_codon2  more_info
chr22   43089055    43089055    -   NM_017436   C       903delC
chr22   43089715    43089717    -   NM_017436   CTT     241_243delTTC
chr12   53701873    53701875    -   NM_015665   TTC A   1292_1294delTTCinsA

Eu preciso manter o espaço no meu arquivo para que minhas colunas não sejam alteradas. Alguma ideia de como fazer isso? Talvez awk ? Eu ainda estou aprendendo essas técnicas. Você pode explicar suas respostas?

    
por cosmictypist 02.07.2015 / 14:26

4 respostas

3

Como você deseja preservar suas colunas, é possível alterar o separador de campo de saída para tab não space , por exemplo, e será mais fácil para processamento adicional se você confiar na contagem de colunas. Então você pode usar o seguinte awk :

awk 'BEGIN { OFS = "\t"; }; { if ($7 ~ "^[0-9]*$") $7 = " "; else $7 = $7; }; 1'

Na seção BEGIN , estamos alterando o separador de campos de saída ( OFS ) para tab . Na próxima seção, verificamos se 7 th contém apenas números e, se sim, alteramos o valor para space , se não mantermos o valor. Mas com $7 = $7 estamos certos de que reconstruímos a linha atual (registro) por causa da OFS alterada. A alteração de OFS garante mais processamento com awk que a saída conterá 8 colunas se o separador de campo ( FS ) estiver definido como tab .

    
por 02.07.2015 / 15:04
2
sed -e's/  *[^ 0-9]*/&\n/6;:n'      \
    -e's/\(\n[^ ]*\)[^ ]/ /;tn'   \
    -e's/\n//' <infile

Aqui estão alguns sed para fazer isso. A primeira coisa que fazemos é substituir a sexta ocorrência de um ou mais espaços seguidos por uma seqüência de zero ou mais [^ 0-9] não-espaço ou caracteres numéricos com ele mesmo seguido por uma nova linha.

Basicamente, isso significa que, se a sétima coluna consistir inteiramente de caracteres diferentes de espaços ou números, sed acrescentará uma nova linha a ela. Caso contrário, sed irá adicionar uma nova linha a ela.

Na próxima instrução, substituímos todos os caracteres não-espaciais imediatamente após uma nova linha no espaço padrão, com um caractere de espaço cada. É claro que isso só acontece quando a nova linha já não é seguida por um caractere de espaço, como aconteceria se a sétima coluna não fosse numérica.

Por fim, removemos o delimitador de nova linha inserido.

OUTPUT

chrom   start   stop    strand  isoform mu_codon    mut_codon   more_info
chr22   43089055    43089055    -   NM_017436   C       903delC
chr22   43089715    43089717    -   NM_017436   CTT     241_243delTTC
chr12   53701873    53701875    -   NM_015665   TTC A   1292_1294delTTCinsA
    
por 02.07.2015 / 15:39
2
awk '{gsub("^[0-9]*$"," ",$7);$7=$7;OFS="\t";print}' file.txt
    
por 02.07.2015 / 14:50
0

Perl para o resgate:

#!/usr/bin/perl
use warnings;
use strict;

while (<>) {                     # Process line by line.
    my @F = split /(\s+)/;       # Split the line into @F, keep whitespace as members, too.
    $F[12] =~ s/./ /g            # Replace any character with space
        if $F[12] =~ /^[0-9]+$/; # if there are just digits.
    print @F;                    # Print the result.
}
    
por 02.07.2015 / 14:35

Tags