Angelo
Angelo

Reputation: 5079

Reading from file and passing it to another command

I have a two column tab delimited file the contains input for a command.

The input file looks like this:

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

the command line is:

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

where trt.bam are the names of files in column 1 and ctrl.bam are the names of files in col2.

what I trying is to read these values from input file and run them.

To do achieve this I am doing following:

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

This is failing. The error that I get is:

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

In an ideal situation this should be taking inputs like this:

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

Where Macs is a standalone software that runs on linux. In the present situation, the software is failing to read the input from the file.

Any inputs are deeply appreciated.

Upvotes: 0

Views: 129

Answers (1)

kvantour
kvantour

Reputation: 26591

I believe what you want to achieve is a loop over all lines in your input file. In bash, you can achieve this as :

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

See: https://mywiki.wooledge.org/BashFAQ/001 (cfr. Sundeep's comment)

original answer:

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

This will read the input file input_file.txt line by line and store it in a bash array named a using read -a a. From that point forward, you process your command with the variables ${a[0]} and ${a[1]}.

Upvotes: 4

Related Questions