从文件读取并将其传递给另一个命令

时间:2018-07-09 09:29:00

标签: bash awk sed

我有两列制表符分隔的文件,其中包含命令的输入。

输入文件如下:

 2795.bam   2865.bam
 2825.bam   2865.bam
 2794.bam   2864.bam

命令行为:

macs2 callpeak -t trt.bam -c ctrl.bam -n Macs.name.bam --gsize hs --nomodel

其中trt.bam是第1列中的文件名,而ctrl.bam是col2中的文件名。

我试图从输入文件中读取这些值并运行它们。

要做到这一点,我正在做以下事情:

cat temp | awk '{print $1 "\t" $2 }' | macs2 callpeak -t $1 -c $2 -n Macs.$1 --gsize hs --nomodel 

这是失败的。我得到的错误是:

usage: macs2 callpeak [-h] -t TFILE [TFILE ...] [-c [CFILE [CFILE ...]]]
                      [-f {AUTO,BAM,SAM,BED,ELAND,ELANDMULTI,ELANDEXPORT,BOWTIE,BAMPE,BEDPE}]
                      [-g GSIZE] [--keep-dup KEEPDUPLICATES]
                      [--buffer-size BUFFER_SIZE] [--outdir OUTDIR] [-n NAME]
                      [-B] [--verbose VERBOSE] [--trackline] [--SPMR]
                      [-s TSIZE] [--bw BW] [-m MFOLD MFOLD] [--fix-bimodal]
                      [--nomodel] [--shift SHIFT] [--extsize EXTSIZE]
                      [-q QVALUE | -p PVALUE] [--to-large] [--ratio RATIO]
                      [--down-sample] [--seed SEED] [--tempdir TEMPDIR]
                      [--nolambda] [--slocal SMALLLOCAL] [--llocal LARGELOCAL]
                      [--broad] [--broad-cutoff BROADCUTOFF]
                      [--cutoff-analysis] [--call-summits]
                      [--fe-cutoff FECUTOFF]
macs2 callpeak: error: argument -t/--treatment: expected at least one argument

在理想情况下,应该采用这样的输入:

macs2 callpeak -t 2795.bam -c 2865.bam -n Macs.2795 --gsize hs --nomodel 

Macs是在Linux上运行的独立软件。在当前情况下,该软件无法从文件读取输入。

任何投入都会受到赞赏。

1 个答案:

答案 0 :(得分:4)

我相信您要实现的是在输入文件中的所有行上循环。在bash中,您可以通过以下方式实现此目标:

while read -r tfile cfile; do
   macs2 callpeak -t "$tfile" -c "$cfile" -n "Macs.$tfile" --gsize hs --nomodel
done < "input_file.txt"

请参阅:https://mywiki.wooledge.org/BashFAQ/001(cfr。Sundeep的评论)

原始答案:

while read -a a; do
   macs2 callpeak -t "${a[0]}" -c "${a[1]}" -n "Macs.${a[0]}" --gsize hs --nomodel
done < "input_file.txt"

这将逐行读取输入文件input_file.txt,并使用a将其存储在名为read -a a的bash数组中。从那时起,您将使用变量${a[0]}${a[1]}处理命令。