如何通过bash / shell阅读组合列表?

时间:2019-06-08 09:24:06

标签: bash shell loops combinations

我有一个 A_1 文件夹,一个 A_2 文件夹,一个 A_3 文件夹.....直到 A_561 文件夹。

每个文件夹都有一个包含 B_1 B_2 B_3 ...和 B_34 < / em>文件夹。

B_1 文件夹中,有名为 F_1_1.txt F_1_2.txt ... F_1_38.txt < / em>。 F_2_1.txt F_2_1.txt ... F_2_38.txt

B_2 文件夹中,有名为 F_1_1.txt F_1_2.txt ... F_1_38.txt < / em>。 F_2_1.txt F_2_1.txt ... F_2_38.txt

B_2 文件夹中,有名为 F_1_1.txt F_1_2.txt ... F_1_38.txt < / em>。 F_2_1.txt F_2_1.txt ... F_2_38.txt

然后,我将运行一个java程序来处理这些文件:

java -jar beagle.28Sep18.793.jar  \
gt=/A_1/B_1/F_1_1.txt /A_1/B_1/F_2_1 out=/C/test_1.out;.....     

java -jar beagle.28Sep18.793.jar  \
gt=/A_1/B_2/F_1_2.txt /A_1/B_2/F_3_2 out=/C/test_2.out;.....    

java -jar beagle.28Sep18.793.jar  \
gt=/A_2/B_3/F_3_1.txt /A_2/B_3/F_4_1 out=/C/test_3.out;    

java -jar beagle.28Sep18.793.jar  \
gt=/A_3/B_1/F_1_38.txt /A_3/B_1/F_1_38 out=/C/test_4.out;  

我可以运行for循环bash来通过

读取文件
for folder in $(seq 561); do 
    for file in $(seq 1 34); do 
        for sample in $(seq 1 38); do   
java -jar beagle.28Sep18.793.jar gt=/A_"$folder"/B_"$file"/F_"$file"_"sample".txt /A_"$folder"/B_"$file"/F_"$file"_"sample" out=/C/test_"file"_"$sample".out  
        done  
     done  
done  

此命令运行速度可能很慢。我知道有些文件没有退出,但是java将跳过它并继续运行。对于这种情况,我想知道如何编写命令以正确读取文件。

1 个答案:

答案 0 :(得分:2)

由于它的格式设置很差,因此不能确定您是否正确理解了您的问题,但是我认为您想在文件夹层次结构中的每个文本文件上运行Java程序。我认为您可以与 GNU Parallel 相对容易且快速地并行进行。

因此,这是使用find生成文本文件列表的方法:

find . -name \*.txt -print

如果看起来正确,则可以再次运行相同的名称,但每个名称都以null终止,然后将其传递给 GNU Parallel ,如下所示:

find . -name \*.txt -print0 | parallel -0

现在,您要为每个文件运行一个Java程序,并为输出文件使用一个递增的数字,因此我们可以进行空运行,它仅打印将要执行的操作,而无需实际执行任何操作,例如:

find . -name \*.txt -print0 | parallel -0 --dry-run java -jar beagle.28Sep18.793.jar gt={} out=/C/test_{#}.out

如果看起来正确,请删除--dry-run并再次运行,它将与您拥有CPU核心的Java实例并行运行,并使它们全忙直到工作完成。