【问题标题】:How to automate generating input for script paths when number of variables changes between inputs当输入之间的变量数量发生变化时,如何自动为脚本路径生成输入
【发布时间】:2019-12-16 16:17:05
【问题描述】:

我有一个 variables.txt 文件,其中包含如下变量名列表:

Target  Location    Control_A   Control_B   Control_C   
Sample_A    City    Bos_1   Bos_2   Bos_3
Sample_B    Countryside Rno_1   Rno2
Sample_C    City    Cat_1   

我需要使用这些详细信息来创建可以提交给脚本的命令列表,该脚本使用这些变量名称作为以下格式的信息:

./script.sh -target /path/to/Target -location /path/to/Location -controls /path/to/Control_A,/path/to/Control_B,/path/to/Control_C -outdir /path/to/outdir

通常我会在终端中定义我的变量,例如:

Path_to_data="/home/user/data/"
Target="Sample_A"
Control_A="Rno_1"
Control_B="Rno_2"

然后我会提交带有变量名的命令,例如:

./script.sh -target /$Path_to_data/"$Target"_data/"$Target -Location /$Path_to_data/$Location -controls /$Path_to_data/$Control_A,/$Path_to_data/$Control_B

问题是现在我有超过 100 个工作要提交,所以这种方法不可行。

我想要一个脚本或循环来读取 variables.txt 文件,并为每一行输出一行到一个新的 output.txt 文件,其中每一行都是 ./script.sh 的完整命令输入

一个关键问题是我不知道如何自动化它,因为控件的数量因样本而异。因此,我不能简单地将 Control_A、Control_B 和 Control_C 列分配为变量,并将它们及其路径打印为 ./script.sh 输入的 -controls 部分的逗号分隔值,因为有时只有一两个控件取决于 variables.txt 文件中的行。

output.txt 如下所示:

./script.sh -target /home/user/data/SampleA_data/Sample_A -Location /home/user/data/City -controls /home/user/data/Bos_1,/home/user/data/Bos_2,/home/user/data/Bos_3
./script.sh -target /home/user/data/SampleB_data/Sample_B -Location /home/user/data/Countryside -controls /home/user/data/Rno_1,/home/user/data/Rno2
./script.sh -target /home/user/data/SampleC_data/Sample_C -Location /home/user/data/City -controls /home/user/data/Cat_1

提前感谢您的帮助。

【问题讨论】:

  • 你的 variables.txt 文件中的分隔符是一个单独的表格,对吧?

标签: bash shell loops for-loop


【解决方案1】:
#!/bin/bash

prefix=/home/user/data/
while read -r target location ctrla ctrlb ctrlc; do
  [ -n "$ctrlb" ] && ctrlb=",${prefix}${ctrlb}"
  [ -n "$ctrlc" ] && ctrlc=",${prefix}${ctrlc}"

  printf './script.sh -target %s -Location %s -controls %s\n'\
    "${prefix}${target}"\
    "${prefix}${location}"\
    "${prefix}${ctrla}${ctrlb}${ctrlc}"

done < <(tail -n+2 variables.txt) > output.txt

我假设 TargetLocationControl_A 始终设置。只有Control_BControl_C 是可选的。

tail -n+2 用于跳过variables.txt 的标题行。您的示例target 输出看起来有点不同(.../SampleA_data/Sample_A),我不是您想要的。根据需要更改此部分。

示例输出:

$ cat output.txt
./script.sh -target /home/user/data/Sample_A -Location /home/user/data/City -controls /home/user/data/Bos_1,/home/user/data/Bos_2,/home/user/data/Bos_3
./script.sh -target /home/user/data/Sample_B -Location /home/user/data/Countryside -controls /home/user/data/Rno_1,/home/user/data/Rno2
./script.sh -target /home/user/data/Sample_C -Location /home/user/data/City -controls /home/user/data/Cat_1

【讨论】:

    猜你喜欢
    • 2018-07-03
    • 2016-04-06
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 2012-09-02
    • 2020-05-08
    • 1970-01-01
    相关资源
    最近更新 更多