У меня есть большой файл фесты, я хочу удалить всю букву после первого пространства в строке заголовка, которые запускаются с определенного символа/символа (>
).
Вот входной файл в качестве примера:
>AB3446 human helix ACGTGAGATGGATAGA
GATAGATAGATAGACACA
>AH4567 human beta sheet
ACGTGATAGATGAGACGATGCCC
CACGGGTATATAGCCCAA
Данный
$ 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
Принятие данных в качестве примера из Вашего вопроса хранится в 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
использовать содержание первой группы получения (что было подобрано шаблоном в крайней левой паре круглых круглых скобок (...)
) от подобранной строки как замена. В нашем случае это - все до первого пробела, исключительно.
С использованием разделения слова:
$ 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 -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
Принимающие строки других содержат только одно слово (как в примере), это является довольно прямым:
cut -f 1 -d " " file.fasta