便携外壳方式

便携外壳方式

我有很大的 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添加选项来告诉它就地修改给定的文件,而不仅仅是显示输出:-ised

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

相关内容