删除以特定字符开头的行中空格后的所有字母
我有一个大的fasta文件,我想删除标题行中以特定字符/符号( >
)开头的第一个空格后的所有字母。
这是一个示例输入文件:
>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
处理文本并删除(包括)以>
开头的每行中的第一个空格字符后的所有内容:
$ sed -r 's/^(>\S+)\s.*/\1/' file.txt >AB3446 GATAGATAGATAGACACA >AH4567 ACGTGATAGATGAGACGATGCCC CACGGGTATATAGCCCAA
如果命令sed -r 's/^(>\S+)\s.*/\1/' file.txt
为您生成正确的输出,您可以告诉它就地修改给定文件,而不仅仅是通过向此sed
命令添加-i
选项来显示输出:
sed -r -i 's/^(>\S+)\s.*/\1/' file.txt
这样做很简单。 -r
启用扩展正则表达式,为我们提供了更多function来在我们的命令中定义正则表达式模式,即s/PATTERN/REPLACEMENT/
here。
PATTERN
是正则表达式^(>\S+)\s.*
,它匹配行开头的>
字符( ^
),后跟至少一个非空白字符( \S+
),一个空格字符( \s
,可以是正常的空白,制表符等)然后是整行的其余部分( .*
是任意数量的任何字符)。
REPLACEMENT
是\1
,它告诉sed
使用匹配行作为替换的第一个捕获组的内容(最左边的一对圆括号内的模式匹配的内容(...)
)。 在我们的例子中,这是第一个空白的所有内容。
便携式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
假设其他行只包含一个单词(如示例中所示),这非常简单:
cut -f 1 -d " " file.fasta