繁体   English   中英

Linux bash 从文件读取行到脚本

[英]Linux bash read lines from file to script

我想创建一个 bash 脚本,但我希望可以配置一些参数。 我有一个主要的 bash.sh 脚本,我想在其中加载一些命令。 到目前为止,这是原始文件的样子:

#!/bin/bash

source values.txt

for i in $(ls 3_TRIMMED/*_R1.* | sort -u); do echo STAR --genomeDir $ref_genome \
--readFilesIn ${i} ${i/_R1./_R2.} \
--runThreadN $runThread --outFileNamePrefix 5_ALIGNED/${i} \
--sjdbGTFfile $gtf_file \
--readFilesCommand gunzip -c ; done

$ref_genome $runThread $gtf_file 在源代码的帮助下来自配置文件。 所以事实证明我需要更多的配置选项,这样是不可能的。 所以我解决了另一个文件,其中包含我想在循环中运行的命令行:

>STAR
STAR --genomeDir $ref_genome --readFilesIn ${i} ${i/_R1./_R2.} --runThreadN $runThread --outFileNamePrefix 5_ALIGNED/${i} --sjdbGTFfile $gtf_file --readFilesCommand gunzip -c
STAR>

以及从文件中读取该行命令的脚本:

star="$( awk '/>STAR/{flag=1; next} /STAR>/{flag=0} flag' test.sh)"

这将读取 STAR 标签之间的命令并将其保存为字符串。

我的问题是,当我在 for 循环中使用该字符串时,例如:

for i in $(ls 3_TRIMMED/*_R1.* | sort -u); do echo $star; done

它创建了循环,但不替换应该来自源的值:

STAR --genomeDir $ref_genome --readFilesIn ${i} ${i/_R1./_R2.} --runThreadN $runThread --outFileNamePrefix 5_ALIGNED/${i} --sjdbGTFfile $gtf_file --readFilesCommand gunzip -c
STAR --genomeDir $ref_genome --readFilesIn ${i} ${i/_R1./_R2.} --runThreadN $runThread --outFileNamePrefix 5_ALIGNED/${i} --sjdbGTFfile $gtf_file --readFilesCommand gunzip -c
STAR --genomeDir $ref_genome --readFilesIn ${i} ${i/_R1./_R2.} --runThreadN $runThread --outFileNamePrefix 5_ALIGNED/${i} --sjdbGTFfile $gtf_file --readFilesCommand gunzip -c

有没有办法像我的原始脚本一样加载值?

谢谢!

我建议您使用正确的引用和使用中间变量来处理文件名和路径来清理您的脚本:

#!/bin/bash

source values.txt

trimmed_dir='./3_TRIMMED'
aligned_dir='./5_ALIGNED'

# Iterates _R1 file paths in trimmed_dir
for r1_path in "${trimmed_dir}/"*_R1.*; do

  # Trims leading path to get file name only
  r1_file="${r1_path##*/}"

  # Trims trailing .extension to get base name
  r1_base_name="${r1_file%.*}"

  # Trims leading base name to get extension 
  r1_ext="${r1_file#*.}"

  # Gets base name of R2 by replacing
  # trailing _R1 from r1 base name with _R2
  r2_base_name="${r1_base_name%_R1}_R2"

  # Adds .extension to r2 file
  r2_file="${r2_base_name}.${r1_ext}"

  # Concatenates base trimmed_dir and r2 file name to get r2 path
  r2_path="${trimmed_dir}/${r2_file}"

  # Creates out-file prefix from r1 base name
  out_file_name_prefix="${aligned_dir}/${r1_base_name}"

  # Do STAR stuffs
  echo STAR \
    --genomeDir "$ref_genome" \
    --readFilesIn "${r1_path}" "${r2_path}" \
    --runThreadN "$runThread" \
    --outFileNamePrefix "${out_file_name_prefix}" \
    --sjdbGTFfile "$gtf_file" \
    --readFilesCommand gunzip -c
done

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM