Есть люди, более умные, чем я здесь, но это ситуация с двойной загрузкой? Как, они оба разделены разделом? Если да, то да просто отформатируйте раздел ОС, который больше не нужен. Просто сохраните все свои вещи.
Предполагая, что данные примера из вашего вопроса хранятся в file.txt, вы можете использовать sed для обработки текста и удаления всего после (и включая) первого символа пробела в каждой строке, начиная с >: [ ! d0] $ 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 позволяет использовать расширенные регулярные выражения, что дает нам больше возможностей для определения шаблонов регулярных выражений в нашей команде, здесь s/PATTERN/REPLACEMENT/.
PATTERN - это регулярное выражение ^(>\S+)\s.*, которое соответствует символу > в начале строки (^), за которым следует по крайней мере один символ без пробелов (\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
Учитывая
$ 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
Предполагая, что другие строки содержат только одно слово (как в примере), это довольно прямолинейно:
cut -f 1 -d " " file.fasta
предположим на примере данных из вашего вопроса хранится в file.txt, вы могли бы использовать [F4] для того, чтобы обработать текст и удалить все, что после (и включая) первого символу в каждой строке, начиная с >:
$ 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
это просто. [F9] и позволяет расширенных регулярных выражений, дает нам больше возможностей, чтобы определить регулярные выражения в нашу команду, которая [F10] для здесь.
PATTERN является регулярным выражением ^(>\S+)\s.*, что соответствует [от f13] символ в начале строки (^), а затем как минимум один непробельный символ (\S+), символ пробела (\s, может быть обычный пробел, табуляция и т. д.) и тогда вся остальная часть линии ([f17 в] - любое количество любых символов).
REPLACEMENT это [зг19], который говорит [20 фунтов], чтобы использовать содержимое первого захвата группы (то есть соответствует шаблону внутри левой пары круглых скобках [клавиши f21]) от согласованной линии в качестве замены. В нашем случае, это все до первого пробела, исключительно.
С использованием разделения слов:
$ 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
Учитывая
$ 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
Предполагая, что другие строки содержат только одно слово (как в примере), это довольно прямолинейно:
cut -f 1 -d " " file.fasta