从文件中读取变量并在bash中循环遍历它们

时间:2016-10-13 15:02:45

标签: bash

我有一个包含如下变量的文本文件:

lane1_pair1="file1"
lane1_pair2="file2"
lane2_pair1="file3"
lane2_pair2="file4"
...

我想循环遍历变量并将它们连接在一个文件中。我将循环应用为:

. variables
for (( n=1; n<=no_lanes; n++ )) {

        cat $"lane"${n}_pair1 >> "$sampleID"_cat1.fq
        cat $"lane"${n}_pair2 >> "$sampleID"_cat2.fq
}

"$sampleID"_cat1.fq > fq_align_1
"$sampleID"_cat2.fq > fq_align_2

这里的问题是,cat命令不起作用,因为不是用"laneX_pairY"替换它的值,而是将其视为字符串。我想知道这里是否有人对此有任何想法。

1 个答案:

答案 0 :(得分:0)

正如我所看到的,问题是你是否循环遍历名为数组但不是一个的变量。然后,您将尝试评估从其他索引变量创建的变量名称的内容,这是一个易于破解的混乱代码的配方。我建议从variables文件中创建实际的文件名数组:

p1_files=($(grep 'pair1' variables | cut -d '=' -f 2))
p2_files=($(grep 'pair2' variables | cut -d '=' -f 2))

for f in "${p1_files[@]}"; do
    cat "${f//\"/}" >> "$sampleID"_cat1.fq
done

for f in "${p2_files[@]}"; do
    cat "${f//\"/}" >> "$sampleID"_cat2.fq
done

我不确定您希望fq_align_n个变量如何,但您可以使用以下命令将文件内容读取到变量:

fq_align_1=$(cat "$sampleID"_cat1.fq)
fq_align_2=$(cat "$sampleID"_cat2.fq)

或者只是完全跳过文件创建并在循环中逐步构建变量。