Excluindo texto após um caractere várias vezes em uma coluna

1

Por isso, tenho algumas configurações de texto na segunda e terceira colunas do meu arquivo da seguinte forma:

GO:0005634^cellular_component^nucleus'GO:0003677^molecular_function^DNA binding'  

Eu quero me livrar de todo o texto relacionado à função e ter a saída assim:

GO:0005634'GO:0003677

Não sei como abordar isso usando sed ou awk

Nota : as linhas têm várias quantidades de GO:xxxxxxx .

    
por ddeokbokki 05.07.2018 / 20:43

4 respostas

1

Parece que os dados usam backticks como separadores de registros e circunflexos como delimitadores de campo.

printf 'GO:0005634^cellular_component^nucleus'GO:0003677^molecular_function^DNA binding'' |
awk -F '^' -v RS=''' -v ORS=''' '{ print $1 }'

Isto imprime apenas o primeiro campo de cada registro (o termo GO), com backticks como o separador de registro de saída.

Saída:

GO:0005634'GO:0003677'

(sem nova linha)

    
por 06.07.2018 / 10:01
1

Isso faz o que eu acredito que você está pedindo. NOTA: input.txt é o seu arquivo de entrada.

apenas sed
$ sed 's/\^[^']*//g' input.txt
GO:0005634'GO:0003677'
GO:0005634'GO:0003677'
GO:0005634'GO:0003677'
GO:0005634'GO:0003677'
Explicação

sed é usado para remover as subcordas que começam com um acento circunflexo (^) e podem conter qualquer coisa, exceto um único backtick. Quando um backtick for encontrado, sed substituirá isso por nada, excluindo-o com eficiência. Este padrão é repetido até esgotar. Isso tem o efeito de remover todas as strings ^.... .

grep + colar + sed
$ grep -o 'GO:[0-9]\+' input.txt | paste -d''' - - | sed 's/$/'/'
GO:0005634'GO:0003677'
GO:0005634'GO:0003677'
GO:0005634'GO:0003677'
GO:0005634'GO:0003677'
Explicação

grep extrai todas as strings GO: XXXXX do arquivo input.txt , paste as coloca em 2 colunas, com um único tique entre as duas strings GO GO: XXXXX e, finalmente, sed adiciona uma único carrapato até o fim.

Referências

por 05.07.2018 / 21:33
0

Com o GNU Awk ( gawk ):

gawk 'BEGIN{FPAT="'?GO:[0-9]+"; OFS=""} {$1=$1} 1' file

Ex.

$ echo 'GO:0005634^cellular_component^nucleus'GO:0003677^molecular_function^DNA binding'' | 
  gawk 'BEGIN{FPAT="'?GO:[0-9]+"; OFS=""} {$1=$1} 1'
GO:0005634'GO:0003677
    
por 05.07.2018 / 22:17
0
perl -lne 'print /((?:^|')GO:\d+)/g' genes.file

Explicação:

  • Executar perl no modo de linha com impressão explícita de registros para stdout -n
  • o regex / ((?: ^ | ') GO: \ d +) / g irá, no registro atual, a string GO: para cuja direita é um número e à esquerda é o BOL ou um backquote. isso é então obtido tantas vezes quanto for encontrado, / g, e entregue ao comando print que então é exibido para stdout com o OFS padrão que é nulo.
por 06.07.2018 / 09:55