我有很大的 fasta 文件,我想删除以特定字符/符号 ( >
) 开头的标题行中第一个空格后的所有字母。
以下是示例输入文件:
>AB3446 human helix ACGTGAGATGGATAGA
GATAGATAGATAGACACA
>AH4567 human beta sheet
ACGTGATAGATGAGACGATGCCC
CACGGGTATATAGCCCAA
答案1
鉴于
$ 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
答案2
假设您问题中的示例数据存储在中file.txt
,您可以使用它sed
来处理文本并删除以 开头的每行中第一个空格字符之后的所有内容(包括该字符)>
:
$ 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
使用匹配行中第一个捕获组的内容(最左边一对圆括号内的模式所匹配的内容(...)
)作为替换。在我们的例子中,这是直到第一个空格为止的所有内容。
答案3
便携外壳方式
使用分词:
$ 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
答案4
假设其他行只包含一个单词(如示例中所示),这很简单:
cut -f 1 -d " " file.fasta