如何使用bash循环替换fasta文件中行中的字母?

时间:2019-01-03 18:27:52

标签: bash sed

我想将序列中的所有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      

4 个答案:

答案 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