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

Есть люди, более умные, чем я здесь, но это ситуация с двойной загрузкой? Как, они оба разделены разделом? Если да, то да просто отформатируйте раздел ОС, который больше не нужен. Просто сохраните все свои вещи.

1
задан 9 November 2017 в 04:55

8 ответов

Предполагая, что данные примера из вашего вопроса хранятся в 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 использовать содержимое первой группы захвата (что соответствовало шаблону внутри самой левой пары круглых круглых скобок (...)) из согласованной строки в качестве замены. В нашем случае это все, вплоть до первого пробела, исключительно.

1
ответ дан 18 July 2018 в 03:37

портативный shell-путь

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

$ 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

$ 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
ответ дан 18 July 2018 в 03:37

Учитывая

$ 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
ответ дан 18 July 2018 в 03:37

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

cut -f 1 -d " " file.fasta
0
ответ дан 18 July 2018 в 03:37

предположим на примере данных из вашего вопроса хранится в 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]) от согласованной линии в качестве замены. В нашем случае, это все до первого пробела, исключительно.

1
ответ дан 24 July 2018 в 17:53
  • 1
    Это очень хороший ответ. Работал отлично ... Спасибо – Manoj Kumar 9 November 2017 в 02:16
  • 2
    Ницца. Если он решит ваш вопрос, пожалуйста, не забудьте принять этот ответ, щелкнув по кнопке «Серая круглая» слева. Спасибо. – Byte Commander 9 November 2017 в 02:17

портативный shell-путь

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

$ 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

$ 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
ответ дан 24 July 2018 в 17:53

Учитывая

$ 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
ответ дан 24 July 2018 в 17:53

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

cut -f 1 -d " " file.fasta
0
ответ дан 24 July 2018 в 17:53

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

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