Excluindo extensão somente da primeira coluna

3

Eu tenho um arquivo como este com a guia separar duas colunas:

 ENSG00000242268.2    0.07563
 ENSG00000270112.3    0.09976
 ENSG00000167578.15   4.38608
 ENSG00000273842.1    0.0
 ENSG00000078237.5    4.08856

Eu gostaria de remover as extensões numéricas do final na primeira coluna, então a saída será:

 ENSG00000242268    0.07563
 ENSG00000270112    0.09976
 ENSG00000167578    4.38608
 ENSG00000273842    0.0
 ENSG00000078237    4.08856

Basta fazer com que sed 's/\..*$//' retorne apenas o valor da primeira coluna e usar o awk com o separador de campo '.' , awk -F'.' também remove os valores da segunda coluna, pois há números decimais.

Uma pergunta semelhante foi respondida aqui: removendo extensões em uma coluna

Ainda não consigo excluir apenas da primeira coluna.

    
por Roli 25.08.2017 / 21:39

6 respostas

5
Solução

awk :

awk -F'\t' '{sub(/\..+$/,"",$1)}1' OFS='\t' file
  • -F'\t' - separador de campos

  • sub(/\..+$/,"",$1) - remove . dos seguintes caracteres do primeiro campo de uma só vez

A saída:

ENSG00000242268 0.07563
ENSG00000270112 0.09976
ENSG00000167578 4.38608
ENSG00000273842 0.0
ENSG00000078237 4.08856

Ou com a abordagem sed simples:

sed 's/\.[0-9]*//' file
    
por 25.08.2017 / 22:07
5

apenas faça:

sed 's/\(.[0-9]\+\) / /' 

ele corresponderá apenas à primeira parte decimal e a excluirá.

na sua amostra:

echo "ENSG00000242268.2    0.07563
>  ENSG00000270112.3    0.09976
>  ENSG00000167578.15   4.38608
>  ENSG00000273842.1    0.0
>  ENSG00000078237.5    4.08856" | sed 's/\(.[0-9]\+\) / /'
ENSG00000242268    0.07563
ENSG00000270112    0.09976
ENSG00000167578   4.38608

edite se você tiver guias e tente isso:

sed 's/\(.[0-9]\+\)\( \|\t\)/' 
    
por 25.08.2017 / 21:44
4

Podemos combinar um ID estável "genético" do Ensembl com a expressão regular estendida. ENSG[0-9]{11}\.[0-9]+ .

Usando isso com sed :

$ sed -r 's/(ENSG[0-9]{11})\.[0-9]+//' file.in >file.out

Isso não depende do delimitador entre colunas ou onde na linha o identificador ocorre.

    
por 25.08.2017 / 21:58
0
$ awk -F'[\t.]' -v OFS='\t' '{print $1,$3 "." $4}'
ENSG00000242268 0.07563
ENSG00000270112 0.09976
ENSG00000167578 4.38608
ENSG00000273842 0.0
ENSG00000078237 4.08856
    
por 25.08.2017 / 23:32
0

Com o Bash usando a remoção de substring :

#!/usr/bin/env bash

file='file.txt'

while read -r i; do

  a=$( <<< "${i}" cut -d $'\t' -f 1 )
  a=${a%.*}
  b=$( <<< "${i}" cut -d $'\t' -f 2- )

  printf '%s\t%s\n' "${a}" "${b}"

done < "${file}"
    
por 25.08.2017 / 22:36
0
Solução

Perl :

perl -pe 's/\.\d+//

  • \.\d+ corresponde ao primeiro '.' seguido por 1 ou mais dígitos.
  • s/pattern// excluirá o padrão selecionado.
por 26.08.2017 / 13:47

Tags