удалите все буквы после пространства в строке, которые запускаются с определенного символа

У меня есть большой файл фесты, я хочу удалить всю букву после первого пространства в строке заголовка, которые запускаются с определенного символа/символа (>).

Вот входной файл в качестве примера:

>AB3446 human helix ACGTGAGATGGATAGA 
GATAGATAGATAGACACA 
>AH4567 human beta sheet 
ACGTGATAGATGAGACGATGCCC 
CACGGGTATATAGCCCAA
1
задан 9 November 2017 в 03:55

4 ответа

Данный

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

затем

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

замены все от первого пространства (включительно) вперед на каждой строке, которая запускается с >


С другой стороны, с awk:

$ awk '/^>/ {$0=$1} 1' file.fasta 
>AB3446
GATAGATAGATAGACACA 
>AH4567
ACGTGATAGATGAGACGATGCCC 
CACGGGTATATAGCCCAA
3
ответ дан 3 December 2019 в 06:37

Принятие данных в качестве примера из Вашего вопроса хранится в file.txt, Вы могли использовать sed обработать текст и удалить все после (и включая) первый пробельный символ в каждой строке, запускающейся с a >:

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

Если команда sed -r 's/^(>\S+)\s.*/\1/' file.txt производит правильный вывод для Вас, можно сказать ему изменять данный оперативный файл, вместо того, чтобы просто показать вывод, путем добавления -i опция к этому sed команда:

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

То, что это делает, просто. -r включает расширенные регулярные выражения, давая нам больше функциональности для определения regex шаблонов в нашей команде, которая является s/PATTERN/REPLACEMENT/ здесь.

PATTERN регулярное выражение ^(>\S+)\s.* который соответствует a > символ в начале строки (^) сопровождаемый по крайней мере одним непробельным символом (\S+), пробельный символ (\s, мог быть нормальный пробел, вкладка, и т.д.) и затем целый отдых строки (.* любое количество любых символов).

REPLACEMENT \1 который говорит sed использовать содержание первой группы получения (что было подобрано шаблоном в крайней левой паре круглых круглых скобок (...)) от подобранной строки как замена. В нашем случае это - все до первого пробела, исключительно.

1
ответ дан 3 December 2019 в 06:37

портативная оболочка путь

С использованием разделения слова:

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

С использованием case и замена параметра:

$ 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

не портативный удар путь

$ 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
1
ответ дан 3 December 2019 в 06:37

Принимающие строки других содержат только одно слово (как в примере), это является довольно прямым:

cut -f 1 -d " " file.fasta
0
ответ дан 3 December 2019 в 06:37

Другие вопросы по тегам:

Похожие вопросы: