【问题标题】:Is there a way to permute inside using to variables in bash?有没有办法在bash中使用to变量进行置换?
【发布时间】:2022-01-14 18:23:05
【问题描述】:

我正在使用软件 plink2 (https://www.cog-genomics.org/plink/2.0/),我正在尝试迭代 3 个变量。

该软件接受一个带有 .ped 扩展名的输入文件和一个带有 .txt 扩展名的排除文件,其中包含要从输入文件中排除的名称列表。

想法是遍历输入文件,然后遍历排除文件以生成单个输出文件。

  1. 输入文件:Highland.ped - Midland.ped - Lowland.ped
  2. 排除地图文件:HighlandMidland.txt - HighlandLowland.txt - MidlandLowland.txt
  3. 输出文件:HighlandMidland - HighlandLowland - MidlandHighland - MidlandLowland - LowlandHighland - 低地米德兰

一般代码是:

plink2 --file Highland --exclude HighlandMidland.txt --out HighlandMidland
plink2 --file Highland --exclude HighlandLowland.txt --out HighlandLowland
plink2 --file Midland --exclude HighlandMidland.txt --out MidlandHighland
plink2 --file Midland --exclude MidlandLowland.txt --out MidlandLowland
plink2 --file Lowland --exclude HighlandLowland.txt --out LowlandHighland
plink2 --file Lowland --exclude MidlandLowland.txt --out LowlandMidland

为避免在 6 次不同时间重复此代码,我想使用上面列出的变量(1、2 和 3)来创建单个输出文件。输出文件是输入文件名称替换的排列。

【问题讨论】:

  • 不确定我是否理解正确,但从您的描述来看,您更像是在搜索combinations,而不是permutations。跨度>
  • 请至少显示您为获得所需结果而编写的代码,以便我们看到您在什么时候得到了错误的结果。

标签: bash for-loop if-statement while-loop


【解决方案1】:

老实说,我认为您当前的代码非常清晰;但如果你真的想把它写成一个循环,这里有一种可能性:

lands=(Highland Midland Lowland)
for (( i = 0 ; i < ${#lands[@]} ; ++i )) ; do
  for (( j = i + 1 ; j < ${#lands[@]} ; ++j )) ; do
    plink2 --file "${lands[i]}" --exclude "${lands[i]}${lands[j]}.txt" --out "${lands[i]}${lands[j]}"
    plink2 --file "${lands[j]}" --exclude "${lands[i]}${lands[j]}.txt" --out "${lands[j]}${lands[i]}"
  done
done

还有一个:

lands=(Highland Midland Lowland)
for (( i = 0 ; i < ${#lands[@]} ; ++i )) ; do
  for (( j = 0 ; j < ${#lands[@]} ; ++j )) ; do
    if [[ "$i" != "$j" ]] ; then
      plink2 \
        --file "${lands[i]}" \
        --exclude "$lands[i < j ? i : j]}$lands[i < j ? j : i]}.txt" \
        --out "${lands[i]}${lands[j]}"
    fi
  done
done

。 . .但上述两者之间的一个共同因素是它们比您当前的代码不太清晰!

【讨论】:

    猜你喜欢
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多