【问题标题】:How to read through two files in bash to create a list of nested output to parallelise a command如何在 bash 中通读两个文件以创建嵌套输出列表以并行化命令
【发布时间】:2020-08-08 07:27:16
【问题描述】:

我一直在使用 bash 生成分析命令列表,如下所示:

while read sample control; do echo analysis --target $sample --control $control --output /path/to/results/$sample/'$sample'_output.txt >> /path/to/commands/commands.txt ; done < sample_list.txt

输入文件 sample_list.txt 如下所示

sample_A control_A
sample_B control_B

但是,我想让一些事情变得更复杂,在这些命令中,我在数据子集上运行它以并行化分析,使其运行得更快。我可以通过添加一个选项“--interval-list”并提供总数据的一个子集进行分析来做到这一点。但我不知道谁以有效的方式将其与示例列表一起循环。

我想象的结束命令是这样的:

while read sample control regions; do echo analysis --target $sample --control $control --interval-list $regions --output /path/to/results/$sample/'$sample'_'$regions'_output.txt >> /path/to/commands/commands.txt ; done < sample_list.txt

例如,对于前 2 组示例,我现在希望输出 20 个命令而不是 2 个。使用这些变量:

sample_A control_A Region_1
sample_A control_A Region_2
sample_A control_A Region_3
sample_A control_A Region_4
sample_A control_A Region_5
sample_A control_A Region_6
sample_A control_A Region_7
sample_A control_A Region_8
sample_A control_A Region_9
sample_A control_A Region_10
sample_B control_B Region_1
sample_B control_B Region_2
sample_B control_B Region_3
sample_B control_B Region_4
sample_B control_B Region_5
sample_B control_B Region_6
sample_B control_B Region_7
sample_B control_B Region_8
sample_B control_B Region_9
sample_B control_B Region_10

一个示例输出行是:

analysis --target sample_A --control control_A --interval-list Region_1 --output /path/to/results/sample_A/sample_A_Region_1_output.txt 

我可以将上面的行放入 sample_list.txt 文件中,但这会破坏有效循环的要点。我想我需要一个 sample_list.txt 文件和一个单独的 region.txt 文件作为 --interval-list 变量的输入,因此如果有意义的话,它可以循环遍历 sample_list.txt 文件中每一行的 10 个区域。有点像循环中的循环。

但我不知道如何以一种比手动写出所有组合更容易的方式将 region.txt 文件放入其中。

regions.txt 文件的输入如下:

Region_1
Region_2
Region_3
Region_4
Region_5
Region_6
Region_7
Region_8
Region_9
Region_10

非常感谢您的任何建议。

【问题讨论】:

    标签: bash loops while-loop parallel-processing nested


    【解决方案1】:

    您可以将这些区域读入一个数组并在内循环中循环这些区域:

    #!/bin/bash
    
    # read regions into an array
    mapfile -t regions < regions.txt
    
    while read sample control; do
      for region in "${regions[@]}"; do # loop over regions
        echo "analysis --target $sample --control $control --output /path/to/results/$sample/${sample}_${region}_output.txt"
      done
    done < sample_list.txt > /path/to/commands/commands.txt # write output to commands.txt
    

    【讨论】:

      猜你喜欢
      • 2018-06-08
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 2017-02-02
      • 1970-01-01
      • 2013-02-12
      • 2019-12-07
      相关资源
      最近更新 更多