如何在不获取所有组合的情况下获得大括号扩张对?

时间:2019-02-17 23:48:59

标签: bash unix snakemake

我在macOS High Sierra 10.13.3上工作。我的壳是bash。

输入时,echo {1,2}{3,4}

我得到:13 14 23 24

是否可以选择仅获取13 24

我有兴趣创建许多文件,其中文件中的两个位置一起变化。例如,我想要文件:

file1file1 file2file2 file3file3

写类似file{1,2,3}file{1,2,3} option而不是file1file1 file2file2 file3file3会很方便。

我希望能够在命令中使用此扩展,例如:

touch file{1,2,3}file{1,2,3} option创建三个文件。

我希望我寻找的功能很清楚。

澄清

最终,我要在其中使用此功能的上下文是一个snakemake命令:

snakemake --cores 3 release{42,43,44}/file{42,43,44}.txt

我希望snakemake在其中生成文件release42 / file42.txt,release43 / file43.txt和release44 / file44.txt。

如果我使用循环来实现此目的,则文件将连续产生。但是,通过键入snakemake release42/file42.txt release43/file43.txt release44/file44.txt,将同时生成三个文件。但是,由于我很懒,我想输入比snakemake release42/file42.txt release43/file43.txt release44/file44.txt短的内容。

2 个答案:

答案 0 :(得分:3)

获得13 14次

$ echo 1{3,4}

对于重复项,还有其他方法

$ for i in {1..3}; do printf "file%dfile%d " $i $i; done
file1file1 file2file2 file3file3

touch

一起使用
$ for i in {1..3}; do touch "file${i}file${i}"; done

或者一次使用所有文件名

$ touch $(for i in {1..3}; do printf "file%dfile%d " $i $i; done)

答案 1 :(得分:3)

使用循环来形成数组。

items=( )
for i in {42,43,44}; do
  items+=( "release$i/file$i.txt" )
done

snakemake "${items[@]}"

此操作snakemake仅运行一次,列出所有文件。