我想将序列中的所有n
更改为-
,但是我不知道如何使bash脚本不更改序列名称中显示的n
。我没有sed或regex的经验,无法确保我的bash脚本仅读取不以>
开头的行,因为这表明标题。
示例文件:
>Name_with_nnn
nnnatgcnnnatttg
>Name2_with_nnn
atgggnnnnGGtnnn
同时,我只想在顺序行中将所有小写字母转换为大写字母。我什至不知道如何开始使用sed,我觉得很难理解。
预期输出:
>Name_with_nnn
---ATGC---ATTTG
>Name2_with_nnn
ATGGG----GGT---
因此,在创建序列文件之后,我尝试使用以下命令继续执行脚本:
while IFS= read -r line
do
if [[ $line == ">"* ]]
then
echo "Ignoring header line: $line"
else
echo "Converting to uppercase and then N-to-gaps"
# sed or tr?? do call $line or do I call $OUTFILE? so confused..
fi
done
答案 0 :(得分:2)
您可以使用以下简单的gnu sed
:
sed '/^>/!{s/n/-/g; s/.*/\U&/;}' file
>Name_with_nnn
---ATGC---ATTTG
>Name2_with_nnn
ATGGG----GGT---
答案 1 :(得分:2)
您可以使用sed
在下面的行中解决此问题:
sed -i "/^>/! {s/n/-/g; s/\(.*\)/\U\1/g}" text.txt
您的输出将是:
>Name_with_nnn
---ATGC---ATTTG
>Name2_with_nnn
ATGGG----GGT---
答案 2 :(得分:2)
在纯Bash中,对于较大的输入可能很慢:
while IFS= read -r line; do
case $line in
'>'*)
printf '%s\n' "$line"
;;
*)
line=${line//n/-}
printf '%s\n' "${line^^}"
;;
esac
done < infile
这使用case
statement和模式匹配来测试行是否以>
开头;要修改这些行,请使用parameter expansions。 ${parameter^^}
扩展需要Bash 4.0或更高版本。
答案 3 :(得分:0)
awk
怎么样?
awk '/^[^>]/{gsub("n","-");print toupper($0);next;}1' data
输出:
>Name_with_nnn
---ATGC---ATTTG
>Name2_with_nnn
ATGGG----GGT---
但是,sed
也可以做到这一点(GNU sed):
sed -E '/^[^>]/{s/n/-/g;s/(.*)/\U\1/g;}' data
与以下相同:
sed -E '/^>/!{s/n/-/g;s/(.*)/\U\1/g;}' data
如果要更改位置,可以将-i
开关添加到sed
。