【问题标题】:I want to be able to extract two different sequences from one line我希望能够从一行中提取两个不同的序列
【发布时间】:2020-02-06 06:17:47
【问题描述】:

我希望能够从一行中提取两个不同的序列。

例如:

atg ttg tca aat tca tgg atc atg ttg tca aat tca tgg atc 标签

我想创建一个循环,程序将从第一个 atg 读取到 tag,将该序列输出到文件中,并获取第二个 atg 读取到 tag,将该序列输出到同一个文件中。

我想要的输出:

atg ttg tca aat tca tgg atc atg ttg tca aat tca tgg atc tag
atg ttg tca aat tca tgg atc tag

我该怎么办?

感谢您的帮助。

【问题讨论】:

  • 输出会是什么?你试过什么?
  • 理想情况下,输出将是:atg ttg tca aat tca tgg atc atg ttg tca aat tca tgg atc tag & atg ttg tca aat tca tgg atc tag。我是使用 bash 的初学者。我没有尝试过任何事情,因为我不知道如何解决这个问题:/

标签: bash for-loop while-loop


【解决方案1】:

请您尝试以下方法:

str="atg ttg tca aat tca tgg atc atg ttg tca aat tca tgg atc tag"
start="atg"    # start marker of the sequence
end="tag"      # end marker of the sequence

read -r -a ary <<< "$str"
for (( i=0; i<${#ary[@]}; i++ )); do
    if [[ ${ary[$i]} = $start ]]; then
        index_s+=("$i")
    elif [[ ${ary[$i]} = $end ]]; then
        index_e+=("$i")
    fi
done

s=${index_s[0]}; n=$(( ${index_e[0]} - ${index_s[0]} + 1 ))
echo "${ary[@]:$s:$n}" > "result.txt"
s=${index_s[1]}; n=$(( ${index_e[0]} - ${index_s[1]} + 1 ))
echo "${ary[@]:$s:$n}" >> "result.txt"

结果:

atg ttg tca aat tca tgg atc atg ttg tca aat tca tgg atc tag
atg ttg tca aat tca tgg atc tag

[工作原理]

  • read -r -a ary &lt;&lt;&lt; "$str" 在空格 (IFS) 上拆分 $str 和 将元素存储到数组ary
  • 然后for 循环遍历数组元素的开始/结束 标记。
  • 如果找到开始标记atg,则将位置存储在数组中 index_s。 最后${index_s[0]} 保存开始标记的第一个位置,并且 ${index_s[1]} 持有第二个(依此类推)。 使用结束标记 tag 执行相同的操作。
  • 最终脚本输出两组数组切片。一开始是 第一个 atg 并以第一个 tag 结尾。另一个开始于 第二个atg 并以第一个tag 结束。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    当您最多需要 2 个序列时,您可以在原始字符串和修改后的字符串中使用 grep

    s='atg ttg tca aat tca tgg atc atg ttg tca aat tca tgg atc tag'
    printf "%s\n" "$s" "${s#*atg}" | grep -Eo "atg.*tag"
    

    当你想要提取超过 2 个可用的子字符串时,你需要一个循环。

    s='atg ttg tca aat tca tgg atc atg ttg tca aat tca tgg atc tag'
    while [ "$s" ]; do
       s=$(grep -Eo "atg.*tag" <<< "$s")
       if [ "$s" ]; then
          echo "$s"
          s="${s#atg}"
       fi
    done
    

    【讨论】:

      猜你喜欢
      • 2015-07-11
      • 2022-11-19
      • 2015-03-26
      • 2014-09-04
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多