Bash: 使用第 n 行作为命令行的一部分

Bash: use nth row as part of the command line

我正在尝试使用一个名为 fastqtl 的工具,但它在这里可能不太相关。我有兴趣将 "loc_info.txt" 的每一行分配到选项中。我写了以下命令,但它反弹为“错误解析命令行:无法识别的选项'-n+1'

有没有办法让 fastQTL 每次运行函数时都读取并使用 "loc_info.txt" 中的那一行?

感谢您的任何建议!!

#!/bin/bash

tool="/path/FastQTL-2.165.linux/bin/"
vcf="/path/vcf/"
out="/path/perm_out"

for i in {1..1061}
do
${tool}fastQTL.1.165.linux --vcf ${vcf}GT.vcf.gz --bed pheno_bed.gz --region tail -n+"$i" loc_info.txt --permute 1000 --out "$i"_perm.txt
done

如果你想在另一个命令中使用一个命令的输出,你可以为此使用子 shell,例如:

cmd1 -option $(cmd2)

此处您使用 cmd2 输出作为 cmd 中的输入。这里的关键是“$”和子外壳“()”。所以解决方案可能是:

#!/bin/bash
tool="/path/FastQTL-2.165.linux/bin/"
vcf="/path/vcf/"
out="/path/perm_out"

for i in {1..1061}
do
${tool}fastQTL.1.165.linux --vcf ${vcf}GT.vcf.gz --bed pheno_bed.gz --region $(tail -n+"$i" loc_info.txt) --permute 1000 --out "$i"_perm.txt
done

循环读取文件:

i=1
while read -r line; do
    ${tool}fastQTL.1.165.linux --vcf ${vcf}GT.vcf.gz --bed pheno_bed.gz --region "$line" --permute 1000 --out "$i"_perm.txt
    ((i++))
done < loc_info.txt

尝试替换 tail -n+"$i" loc_info.txt $(head -n $i loc_info.txt | tail -n 1)

例子

numOfLines=$(wc -l loc_info.txt | cut -d ' ' -f 1)

for i in $(seq 1 $numOfLines) 
do
${tool}fastQTL.1.165.linux --vcf ${vcf}GT.vcf.gz --bed pheno_bed.gz -
-region $(head -n $i loc_info.txt | tail -n 1) --permute 1000 --out "$i"_perm.txt
done