【问题标题】:How to replace letters in lines in fasta file using bash loops?如何使用 bash 循环替换 fasta 文件中的行中的字母?
【发布时间】:2019-01-03 18:27:51
【问题描述】:

我想将序列中的所有n 更改为-,但我不知道如何使我的bash 脚本不更改出现在序列名称中的n。我没有使用 sed 或正则表达式来确保我的 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      

【问题讨论】:

    标签: bash sed


    【解决方案1】:

    您可以使用sed 来解决这个问题:

    sed -i "/^>/! {s/n/-/g; s/\(.*\)/\U\1/g}" text.txt
    

    您的输出将是:

    >Name_with_nnn
    ---ATGC---ATTTG
    >Name2_with_nnn
    ATGGG----GGT---
    

    【讨论】:

    • @DNAngel 请注意我更新了脚本,因为缺少转换为大写。
    • @CedricZoppolo 不仅大写,你还更新了start with >,可能值得一提。
    • @Tiw 是正确的。我还更新以确保只有不以> 开头的行才会被转换。我缺少^ 字符,以便获取以> 开头的行,而不是在行的任何部分包含此类字符的行。
    【解决方案2】:

    你可以使用这个简单的gnu sed:

    sed '/^>/!{s/n/-/g; s/.*/\U&/;}' file
    

    >Name_with_nnn
    ---ATGC---ATTTG
    >Name2_with_nnn
    ATGGG----GGT---
    

    【讨论】:

      【解决方案3】:

      在纯 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 来测试一行是否以&gt; 开头;要修改行,使用parameter expansions。 ${<i>parameter</i>^^} 扩展需要 Bash 4.0 或更高版本。

      【讨论】:

        【解决方案4】:

        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。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-05-31
          • 2020-01-01
          • 2021-11-18
          • 1970-01-01
          • 2020-07-23
          • 2015-01-29
          • 1970-01-01
          相关资源
          最近更新 更多