remove todas as letras após o espaço em uma linha que começa com caractere específico

1

Eu tenho um arquivo fasta grande, desejo remover toda a letra após o primeiro espaço em uma linha de cabeçalho que comece com caractere / símbolo específico ( > ).

Aqui está um arquivo de entrada de exemplo:

>AB3446 human helix ACGTGAGATGGATAGA 
GATAGATAGATAGACACA 
>AH4567 human beta sheet 
ACGTGATAGATGAGACGATGCCC 
CACGGGTATATAGCCCAA
    
por Manoj Kumar 08.11.2017 / 22:22

4 respostas

3

Dado

$ cat file.fasta 
>AB3446 human helix ACGTGAGATGGATAGA 
GATAGATAGATAGACACA 
>AH4567 human beta sheet 
ACGTGATAGATGAGACGATGCCC 
CACGGGTATATAGCCCAA

então

$ sed '/^>/ s/ .*//' file.fasta 
>AB3446
GATAGATAGATAGACACA 
>AH4567
ACGTGATAGATGAGACGATGCCC 
CACGGGTATATAGCCCAA

substitui tudo do primeiro espaço (inclusive) em todas as linhas que começam com >

Como alternativa, com awk :

$ awk '/^>/ {$0=$1} 1' file.fasta 
>AB3446
GATAGATAGATAGACACA 
>AH4567
ACGTGATAGATGAGACGATGCCC 
CACGGGTATATAGCCCAA
    
por steeldriver 08.11.2017 / 23:57
1

Supondo que os dados de exemplo da sua pergunta estão armazenados em file.txt , você pode usar sed para processar o texto e remover tudo após (e incluindo) o primeiro caractere de espaço em branco em cada linha começando com > :

$ sed -r 's/^(>\S+)\s.*//' file.txt
>AB3446
GATAGATAGATAGACACA 
>AH4567
ACGTGATAGATGAGACGATGCCC 
CACGGGTATATAGCCCAA

Se o comando sed -r 's/^(>\S+)\s.*//' file.txt produzir a saída correta para você, você poderá instruí-lo a modificar o arquivo fornecido in-loco, em vez de apenas mostrar a saída, adicionando a opção -i a este comando sed :

sed -r -i 's/^(>\S+)\s.*//' file.txt

O que isto faz é simples. -r ativa expressões regulares estendidas, fornecendo mais funcionalidades para definir padrões de regex em nosso comando, que é s/PATTERN/REPLACEMENT/ aqui.

PATTERN é a expressão regular ^(>\S+)\s.* que corresponde a um caractere > no início de uma linha ( ^ ) seguido por pelo menos um caractere que não seja espaço em branco ( \S+ ), um caractere de espaço em branco \s , pode ser um espaço em branco normal, tabulação, etc.) e depois todo o resto da linha ( .* é qualquer número de qualquer caractere).

REPLACEMENT é , que indica sed para usar o conteúdo do primeiro grupo de captura (o que corresponde ao padrão dentro do par mais à esquerda de parênteses redondos (...) ) da linha correspondida como substituição. No nosso caso, isso é tudo até o primeiro espaço em branco, exclusivamente.

    
por Byte Commander 08.11.2017 / 22:57
1

caminho de shell portátil

Com o uso da divisão de palavras:

$ while read -r one two;do echo "$one" ;done < input.txt                    
>AB3446
GATAGATAGATAGACACA
>AH4567
ACGTGATAGATGAGACGATGCCC
CACGGGTATATAGCCCAA

Com o uso de case e a substituição de parâmetros:

$ while IFS= read -r line;do case "$line" in ">"*) printf "%s\n" "${line%% *}";;*)printf "%s\n" "$line";;esac ;done < input.txt                                        
>AB3446
GATAGATAGATAGACACA 
>AH4567
ACGTGATAGATGAGACGATGCCC 
CACGGGTATATAGCCCAA

Perl

$ perl -lane '$_=$F[0] if $F[0] =~ /^>/;print' input.txt                                                                                                               
>AB3446
GATAGATAGATAGACACA 
>AH4567
ACGTGATAGATGAGACGATGCCC 
CACGGGTATATAGCCCAA

não bash portátil

$ bash -c 'for((i=0;;i++)); do IFS= read -r line || break; [[ $line =~ ^\> ]] && line=${line/ */} ;echo "$line" ;done' < input.txt                                     
>AB3446
GATAGATAGATAGACACA 
>AH4567
ACGTGATAGATGAGACGATGCCC 
CACGGGTATATAGCCCAA
    
por Sergiy Kolodyazhnyy 09.11.2017 / 01:41
0

Supondo que outras linhas contenham apenas uma palavra (como no exemplo), isso é bastante simples:

cut -f 1 -d " " file.fasta
    
por user285259 09.11.2017 / 07:53