【问题标题】:How can I parallelize my loop ? (fasta file)如何并行化我的循环? (快速文件)
【发布时间】:2019-12-18 15:24:03
【问题描述】:

我编写了一个脚本来更改一个文本文件(fasta 格式)中的特定行,我想并行化,因为有很多行(~800k)。

>CTC14_37541|M00842:336:000000000-C7WWK:1:2101:20913:9309:0:66|o:97|mo:0.000000|MR:n=0;r1=0;r2=0|Q30:p=75;p=71|CO

我想把它改成:

>Sample-CTC14_Read37541

我有两个问题。

  1. 我尝试使用和不使用功能运行我的脚本:

    • 没有功能,它可以工作:我要更改的所有行都被修改。

    • 当我使用一个函数时,只修改了一行。我的函数header() 有问题?

  2. 第二个问题是并行化。我用“&”尝试了一些东西,但我不确定这是最好的解决方案。任何想法?

我的代码没有函数和并行:

#!/bin/bash

TMP_PATH="/path/where/is/my/fasta"
cd $TMP_PATH

for fasta in *.fasta
do
  echo $fasta
    lines=$(grep ">" $fasta)
    for line in $lines
  do
    if [[ $line = *">"* ]]; then
      read_nb="_Read"$(echo $line | cut -d'|' -f1 | cut -d'_' -f2)
      sample=$(echo $line | cut -d'_' -f1 | cut -d'>' -f2)
      newheader=$(echo ">Sample-$sample$read_nb")
      sed -i -e "s/$line/$newheader/g" $fasta
      sed -i -e "s/ /\n/g" $fasta
    fi
    done
done

echo "END"

我的函数和并行代码:

#!/bin/bash

TMP_PATH="/path/where/is/my/fasta"
cd $TMP_PATH

n=0
maxjobs=500


header(){
    if [[ $line = *">"* ]]; then
      read_nb="_Read"$(echo $line | cut -d'|' -f1 | cut -d'_' -f2)
      sample=$(echo $line | cut -d'_' -f1 | cut -d'>' -f2)
      newheader=$(echo ">Sample-$sample$read_nb")
      sed -i -e "s/$line/$newheader/g" $fasta
      sed -i -e "s/ /\n/g" $fasta
    fi
}

for fasta in *.fasta
do
    lines=$(grep ">" $fasta)
    for line in $lines
    do
       header $line &
       #limit jobs
       if (( $(($((++n)) % $maxjobs)) == 0 )) ; then
         wait
         echo $n wait
       fi
    done
done

我有一个 fasta 文件作为输入,其中包含多个标题和序列。我想转换标题以便在特定工作流程中使用我的 fasta 文件。我需要从那开始:

>CTC14_18758|M00842:336:000000000-C7WWK:1:1108:17474:5670:0:66|o:98|mo:0.000000|MR:n=0;r1=0;r2=0|Q30:p=66;p=62|CO:0|
TGGGGAATATTGGACAATGGGCGAAAGCCTGATCCAGCCATGCCGCATGAGTGAAGAAGGCCTTTGGGTTGTAAAGCTCTTTTAGTGAGGAAGATAATGACGGTACTCACAGAAGAAGTCCTGGCTAACTCCGTGCCAGCAGCCGCGGTAATACGGAGAGGGCTAGCGTTATTCGGAATTATTGGGCGTAAAGGGCGCGTAGGCTGGTTAATAAGTTAAAAGTGAAATCCCGAGGCTTAACCTTGGAATTGCTTTTAAAACTATTAATCTAGAGATTGAAAGAGGATAGAGGAATTCCTGATGTAGAGGTAAAATTCGTAAATATTAGGAGGAACACCAGCGGCGAAGGCGTCTATCTGGTTCAAATCTGACGCTGAAGCGCGAAGGCTTGGGGAGCAAACAGG
>CTC14_20535|M00842:336:000000000-C7WWK:1:1108:28568:20175:0:66|o:97|mo:0.000000|MR:n=0;r1=0;r2=0|Q30:p=77;p=64|CO:0|
TGGGGAATATTGGACAATGGGCGAAAGCCTGATCCAGCCATGCCGCATGAGTGAAGAAGGCCTTTGGGTTGTAAAGCTCTTTTAGTGAGGAAGATAATGACGGTACCCACAGAAGAAGTCCTGGCTAACTCCGTGCCAGCAGCCGCGGTAATACGGAGAGGGCTAGCGTTATTCGGAATTATTGGGCGTAAAGGGCGCGTAGGCTGGTTAATAAGTTAAAAGTGAAATCCCGAGGCTTAACCTTGGAATTGCTTTTAAAACTATTAATCTAGAGATTGAAAGAGGATAGAGGAATTCCTGATGTAGAGGTAAAATTCGTAAATATTAGGAGGAACACCAGTGGCGAAGGCGTCTATCTGGTTCAAATCTGACGCTGAAGCGCGAAGGCGTGGGGAGCAAACAGG
>CTC14_24700|M00842:336:000000000-C7WWK:1:1110:7911:9824:0:66|o:97|mo:0.000000|MR:n=0;r1=0;r2=0|Q30:p=77;p=71|CO:0|
TGGGGAATATTGGACAATGGGCGAAAGCCTGATCCAGCCATGCCGCATGAGTGAAGAAGGCCTTTGGGTTGTAAAGCTCTTTTAGTGAGGAAGATAATGACGGTACTCACAGAAGAAGTCCTGGCTAACTCCGTGCCAGCAGCCGCGGTAATACGGAGAGGGCTAGCGTTATTCGGAATTATTGGGCGTAAAGGGCGCGTAGGCTGGTTAATAAGTTAAAAGTGAAATCCCGAGGCTTAACCTTGGAATTGCTTTTAAAACTATTAATCTAGAGATTGAAAGAGGATAGAGGAATTCCTGATGTAGAGGTAAAATTCGTAAATATTAGGAGGAACACCAGTGGCGAAGGCGTCTATCTGGTTCAAATCTGACGCTGAAGCGCGAAGGCGTGGGGAGCAAACAGG

对此:

>Sample-CTC14_Read18758
TGGGGAATATTGGACAATGGGCGAAAGCCTGATCCAGCCATGCCGCATGAGTGAAGAAGGCCTTTGGGTTGTAAAGCTCTTTTAGTGAGGAAGATAATGACGGTACTCACAGAAGAAGTCCTGGCTAACTCCGTGCCAGCAGCCGCGGTAATACGGAGAGGGCTAGCGTTATTCGGAATTATTGGGCGTAAAGGGCGCGTAGGCTGGTTAATAAGTTAAAAGTGAAATCCCGAGGCTTAACCTTGGAATTGCTTTTAAAACTATTAATCTAGAGATTGAAAGAGGATAGAGGAATTCCTGATGTAGAGGTAAAATTCGTAAATATTAGGAGGAACACCAGCGGCGAAGGCGTCTATCTGGTTCAAATCTGACGCTGAAGCGCGAAGGCTTGGGGAGCAAACAGG
>Sample-CTC14_Read20535
TGGGGAATATTGGACAATGGGCGAAAGCCTGATCCAGCCATGCCGCATGAGTGAAGAAGGCCTTTGGGTTGTAAAGCTCTTTTAGTGAGGAAGATAATGACGGTACCCACAGAAGAAGTCCTGGCTAACTCCGTGCCAGCAGCCGCGGTAATACGGAGAGGGCTAGCGTTATTCGGAATTATTGGGCGTAAAGGGCGCGTAGGCTGGTTAATAAGTTAAAAGTGAAATCCCGAGGCTTAACCTTGGAATTGCTTTTAAAACTATTAATCTAGAGATTGAAAGAGGATAGAGGAATTCCTGATGTAGAGGTAAAATTCGTAAATATTAGGAGGAACACCAGTGGCGAAGGCGTCTATCTGGTTCAAATCTGACGCTGAAGCGCGAAGGCGTGGGGAGCAAACAGG
>Sample-CTC14_Read24700
TGGGGAATATTGGACAATGGGCGAAAGCCTGATCCAGCCATGCCGCATGAGTGAAGAAGGCCTTTGGGTTGTAAAGCTCTTTTAGTGAGGAAGATAATGACGGTACTCACAGAAGAAGTCCTGGCTAACTCCGTGCCAGCAGCCGCGGTAATACGGAGAGGGCTAGCGTTATTCGGAATTATTGGGCGTAAAGGGCGCGTAGGCTGGTTAATAAGTTAAAAGTGAAATCCCGAGGCTTAACCTTGGAATTGCTTTTAAAACTATTAATCTAGAGATTGAAAGAGGATAGAGGAATTCCTGATGTAGAGGTAAAATTCGTAAATATTAGGAGGAACACCAGTGGCGAAGGCGTCTATCTGGTTCAAATCTGACGCTGAAGCGCGAAGGCGTGGGGAGCAAACAGG

我想让这个平行,因为我有很多行要更改(~700-800k),如果我逐行运行脚本需要很长时间。

我的脚本没有功能,工作是可行的,但它太长了。

使用具有函数和并行功能的脚本,作业无法正常工作,因为我的 fasta 中只更改了一个标题,而不是所有标题,我不明白为什么。我尝试了不同的方法来编写和调用我的函数,但结果总是一样的。

此外,我尝试使用 gnu-parallel,但方法相同。我认为我的函数或调用有问题,但我不明白在哪里。

我认为按照您的建议使用 awk 是个好主意,但我对此并不满意。你能帮我吗?


我的fasta文件的正确格式是:

>CTC14_1600|M00842:336:000000000-C7WWK:1:1101:26089:18004:0:66|o:97|mo:0.000000|MR:n=0;r1=0;r2=0|Q30:p=77;p=71|CO:0| TGGGGAATATTGGACAATGGGCGAAAGCCTGATCCAGCCATGCCGCATGAGTGAAGAAGGCCTTTGGGTTGTAAAGCTCTTTTAGTGAGGAAGATAATGACGGTACTCACAGAAGAAGTCCTGGCTAACTCCGTGCCAGCAGCCGCGGTAATACGGAGAGGGCTAGCGTTATTCGGAATTATTGGGCGTAAAGGGCGCGTAGGCTGGTTAATAAGTTAAAAGTGAAATCCCGAGGCTTAACCTTGGAATTGCTTTTAAAACTATTAATCTAGAGATTGAAAGAGGATAGAGGAATTCCTGACGTAGAGGTAAAATTCGTAAATATTAGGAGGAACACCAGTGGCGAAGGCGTCTATCTGGTTCAAATCTGACGCTGAAGCGCGAAGGCGTGGGGAGCAAACAGG$
>CTC14_11169|M00842:336:000000000-C7WWK:1:1105:11636:11876:0:66|o:97|mo:0.000000|MR:n=0;r1=0;r2=0|Q30:p=76;p=65|CO:0| TGGGGAATATTGGACAATGGGCGAAAGCCTGATCCAGCCATGCCGCATGAGTGAAGAAGGCCTTTGGGTTGTAAAGCTCTTTTAGTGAGGAAGATAATGACGGTACTCACAGAAGAAGTCCTGGCTAACTCCGTGCCAGCAGCCGCGGTAATACGGAGAGGGCTAGCGTTATTCGGAATTATTGGGCGTAAAGGGCGCGTAGGCTGGTTAATAAGTTAAAAGTGAAATCCCGAGGCTTAACCTTGGAATTGCTTTTAAAACTATTAATCTAGAGATTGAAAGAGGATAGAGGAATTCCTGATGTAGAGGTAAAATTCGTAAATATTAGGAGGAACACCAGTGGCGAAGGCGTCTATCTGGTTCAAATCTGACGCTGAAGCGCGAAGGCGTGGGGAGCAAACAGG$
>CTC14_16471|M00842:336:000000000-C7WWK:1:1107:6941:10486:0:66|o:97|mo:0.000000|MR:n=0;r1=0;r2=0|Q30:p=77;p=70|CO:0| TGGGGAATATTGGACAATGGGCGAAAGCCTGATCCAGCCATGCCGCATGAGTGAAGAAGGCCTTTGGGTTGTAAAGCTCTTTTAGTGAGGAAGATAATGGCGGTACTCACAGAAGAAGTCCTGGCTAACTCCGTGCCAGCAGCCGCGGTAATACGGAGAGGGCTAGCGTTATTCGGAATTATTGGGCGTAAAGGGCGCGTAGGCTGGTTAATAAGTTAAAAGTGAAATCCCGAGGCTTAACCTTGGAATTGCTTTTAAAGCTATTAATCTAGAGATTGAAAGAGGATAGAGGAATTCCTGATGTAGAGGTAAAATTCGTGAATATTAGGAGGAACACCAGTGGCGAAGGCGTCTATCTGGTTCAAATCTGACGCTGAAGCGCGAAGGCGTGGGGAGCAAACAGG$

【问题讨论】:

  • 你写的 Something is wrong in my function "header{}"? 。你的意思是header()?如果是这样,请编辑您的 Q。您的问题看起来很合理,并且要解决 当我使用函数时,只修改一行,您将通过逐行分解函数来了解更多信息,执行每个部分,然后添加下一个部分(在 | 字符之后),看到它正在按预期更改输出,然后继续,直到找到问题的根源。如果没有样本输入和预期输出,我们真的无能为力。但我建议在awk 中重写所有文本处理..
  • ...只有一个进程,效率会高很多。您可能不需要并行化。使用& 进行并行化应该会让事情运行得更快。但是我们不知道您调用的代码中的内容,即limit jobs(虽然这听起来不错)。而wait(使用$maxjobs 检查)似乎很有可能奏效。您可能想查看是否安装了gnu-parallel,因为这是一个专为大规模处理而设计的工具。祝你好运。
  • 您好,感谢您的回答。我编辑了我的问题来回答你并更好地解释我的问题......
  • 信息太多(我认为)。要将>Sample-CTC14_Read18758 更改为>Sample-CTC14_Read18758?并且您想删除第二个标题,即 C7WWK:1:1110:7911:9824:0:66|o:97|mo:0.000000|MR:n=0;r1=0;r2=0|Q30:p=77;p=71|CO:0| ? `sed 可以在一个调用中完成所有这些。见下文。
  • 请确认(对于您的第一个示例记录),>CTC14_18758|M00842:336:000000000- 与后面的内容(即C7WWK:1:1108:28568:20175:0:66|o:97|mo....)位于不同的行上。 Tnx。

标签: bash function loops sed concurrency


【解决方案1】:

假设>CTC14_18758|M00842:336:000000000- 位于单独的一行,此代码会将输入转换为输出。

#!/bin/sed -f

#skip blank lines
/^[[:space:]]*$/n

#change >CTC14_18758|M00842:336:000000000-
#  to >Sample-CTC14_Read18758
s/^>/>Sample-/
s/_/_Read/
/^>/s/|.*$//

# remove 2ndary header
#  C7WWK:1:1108:17474:5670:0:66|o:98|mo:0.000000|MR:n=0;r1=0;r2=0|Q30:p=66;p=62|CO:0| TGGGGAATATTGGAC...
# to
#  TGGGGAATATTGGAC...

s/^[^>].*| //

将其保存为文件/脚本。 然后将其标记为可执行文件

chmod +x mySed

并像运行它一样

./mySed -i fileIn

或者,如果您收到关于 -i 的警告/错误消息,则运行

./mySed fileIn > fileOut && mv fileOut fileIn

现在您可以消除您的函数header(),以及代码中的第二个循环。 只是

for file in *.fasta ; do
   echo "processing file=$file"
   /path/to/mySed -i "$file"
   # run other processing if needed
   # don't think you need wait any more
   #uncomment? wait
done

------------- 版本 2 sed ---------------

#!/bin/sed -f

#skip blank lines
/^[[:space:]]*$/n

#>CTC14_18758|M00842:336:000000000-C7WWK:1:1108:17474:5670:0:66|o:98|mo:0.000000|MR:n=0;r1=0;r2=0|Q30:p=66;p=62|CO:0| TGGGGA...

#change >CTC14_18758|M00842:336:000000000-
#  to >Sample-CTC14_Read18758
s/^>/>Sample-/
s/_/_Read/
s/|.*| / /
# /^>/s/-.*| / /
# s/-.*| / /

使用类似的数据

>CTC14_16471|M00842:336:000000000-C7WWK:1:1107:6941:10486:0:66|o:97|mo:0.000000|MR:n=0;r1=0;r2=0|Q30:p=77;p=70|CO:0| TGGGGAATATTGGACAATGGGCGAAAGCCTGATCCAGCCATGCCGCATGAGTGAAGAAGGCCTTTGGGTTGTAAAGCTCTTTTAGTGAGGAAGATAATGGCGGTACTCACAGAAGAAGTCCTGGCTAACTCCGTGCCAGCAGCCGCGGTAATACGGAGAGGGCTAGCGTTATTCGGAATTATTGGGCGTAAAGGGCGCGTAGGCTGGTTAATAAGTTAAAAGTGAAATCCCGAGGCTTAACCTTGGAATTGCTTTTAAAGCTATTAATCTAGAGATTGAAAGAGGATAGAGGAATTCCTGATGTAGAGGTAAAATTCGTGAATATTAGGAGGAACACCAGTGGCGAAGGCGTCTATCTGGTTCAAATCTGACGCTGAAGCGCGAAGGCGTGGGGAGCAAACAGG

IHTH

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 2021-08-24
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    相关资源
    最近更新 更多