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

Bash 读取文件并将其传递给另一个命令,bash,awk,sed,Bash,Awk,Sed,我有一个由两列制表符分隔的文件,其中包含命令的输入 输入文件如下所示: 2795.bam 2865.bam 2825.bam 2865.bam 2794.bam 2864.bam macs2 callpeak -t 2795.bam -c 2865.bam -n Macs.2795 --gsize hs --nomodel 命令行是: macs2 callpeak -t trt.bam -c ctrl.bam -n Macs.name.bam --gsize hs --n

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

输入文件如下所示:

 2795.bam   2865.bam
 2825.bam   2865.bam
 2794.bam   2864.bam
macs2 callpeak -t 2795.bam -c 2865.bam -n Macs.2795 --gsize hs --nomodel 
命令行是:

macs2 callpeak -t trt.bam -c ctrl.bam -n Macs.name.bam --gsize hs --nomodel
其中trt.bam是第1列中的文件名,ctrl.bam是第2列中的文件名

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

为此,我正在做以下工作:

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
在理想情况下,应采用如下输入:

 2795.bam   2865.bam
 2825.bam   2865.bam
 2794.bam   2864.bam
macs2 callpeak -t 2795.bam -c 2865.bam -n Macs.2795 --gsize hs --nomodel 
其中Macs是一个在linux上运行的独立软件。在当前情况下,软件无法从文件中读取输入


非常感谢您的任何输入。

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

while read -r tfile cfile; do
   macs2 callpeak -t "$tfile" -c "$cfile" -n "Macs.$tfile" --gsize hs --nomodel
done < "input_file.txt"
读取时-r tfile cfile;做
macs2调用峰值-t“$tfile”-c“$cfile”-n“Macs.$tfile”--gsize hs--nomodel
完成<“输入文件.txt”
见:(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"
读取时-a;做
macs2调用peak-t“${a[0]}”-c“${a[1]}”-n“Macs.${a[0]}”-gsize hs--nomodel
完成<“输入文件.txt”

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

处理您的命令。我相信您想要实现的是在输入文件中的所有行上进行循环。在bash中,可以通过以下方式实现:

while read -r tfile cfile; do
   macs2 callpeak -t "$tfile" -c "$cfile" -n "Macs.$tfile" --gsize hs --nomodel
done < "input_file.txt"
读取时-r tfile cfile;做
macs2调用峰值-t“$tfile”-c“$cfile”-n“Macs.$tfile”--gsize hs--nomodel
完成<“输入文件.txt”
见:(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"
读取时-a;做
macs2调用peak-t“${a[0]}”-c“${a[1]}”-n“Macs.${a[0]}”-gsize hs--nomodel
完成<“输入文件.txt”


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

处理您的命令,检查您的问题是否有拼写错误:
trt.bam
vs.
try.bam
。请在您的帖子中发布预期的输出,并让我们知道。编辑完成。请现在检查。如果在
temp
中以制表符分隔输入,您认为
cat temp|awk'{print$1”\t“$2}'
可以做什么?检查您的问题是否有拼写错误:
trt.bam
try.bam
。请在您的帖子中发布预期的输出,并让我们知道。编辑完成。请现在检查。给定
temp
中以制表符分隔的输入,您认为
cat temp|awk'{print$1'\t$2}'
可以做什么?@Angelo为什么需要for循环?这将处理您的完整文件。您已使用while循环完成此操作。这非常好用,我很想知道如何用for循环来构造它。答案很好,但输出和预期不完全一样。Macs.2795.bam不应包含.bam。可能的更正:
Macs.$(echo${a[0]/.*})
@Angelo答案是不应该使用for-loop来读取bash-@ReneKnop中的文件,我相信这是OP的错别字。在他的问题中,他还在原始命令行中写道:
Macs-n Macs.name.bam…
为此,我没有删除
.bam
。如果要删除
-n
参数中的
.bam
,可以使用
macs-n Macs.${a[0]%.bam}…
@Angelo为什么需要for循环?这将处理您的完整文件。您已使用while循环完成此操作。这非常好用,我很想知道如何用for循环来构造它。答案很好,但输出和预期不完全一样。Macs.2795.bam不应包含.bam。可能的更正:
Macs.$(echo${a[0]/.*})
@Angelo答案是不应该使用for-loop来读取bash-@ReneKnop中的文件,我相信这是OP的错别字。在他的问题中,他还在原始命令行中写道:
Macs-n Macs.name.bam…
为此,我没有删除
.bam
。如果要删除
-n
参数中的
.bam
,可以使用
macs-n MAC.${a[0]%.bam}…