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

时间:2018-02-23 23:30:26

标签: bash shell loops unix tail

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

有没有一种方法可以让fastQTL读取并在每次运行函数时使用“loc_info.txt”中的1行?

感谢您的任何建议!!

#!/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

3 个答案:

答案 0 :(得分:3)

循环读取文件:

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

答案 1 :(得分:1)

如果要在另一个命令中使用一个命令的输出,可以使用子shell,如下所示:

cmd1 -option $(cmd2)

这里你使用cmd2输出作为cmd中的输入。这里的关键是'$'和子shell'()'。所以解决方案可能是:

#!/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

答案 2 :(得分:1)

尝试替换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