3

I am combining ls, xargs and bash -c to run a specific program on multiple input files (whose names match the pattern barcode0[1-4].fastq.

The program that I am calling with xargs is called krocus and below is the code I used to call the program with a single placeholder (for the multiple input files):

ls barcode0[1-4].fastq |cut -d '.' -f 1|xargs -I {} bash -c "krocus --verbose --output_file out_krocus/{}_Ecoli1.txt /nexusb/Gridion/MLST_krocus_DBs/e_coli1 {}.fastq

In the above code my placeholder are the files I want to call krocus on i.e. barcode0[1-4].fastq. I now want to add a second placeholder that will be passed to the --kmer argument of krocus. For this argument, I want to pass the numbers seq 12 14 i.e. 12, 13 and 14. In this example I would like to create a total of 12 files (which means I want to combine the three --kmer values for the four input files)

Below is how I imagine this code would look like with the placeholder for the kmer argument:

ls barcode0[1-4].fastq |cut -d '.' -f 1|xargs -I {} bash -c "krocus --verbose --output_file out_krocus/{placeholderForInputFile}_{placeholderForKmerSize}Ecoli1.txt /nexusb/Gridion/MLST_krocus_DBs/e_coli1 --kmer {placeholderForKmerSize} {placeholderForInputFile}.fastq

The problem is that I need to pipe the output of two commands i.e. ls barcode0[1-4].fastq and seq 12 14

Jeff Schaller
  • 66,199
  • 35
  • 114
  • 250
BCArg
  • 205
  • 2
  • 8
  • does this helps? https://unix.stackexchange.com/q/387076/72456 – αғsнιη Sep 23 '19 at 12:59
  • I had a look at that post. The difference is that on that post he's piping from a single command (`echo {1..8`) whereas I need to pipe from two commands (`ls barcode0[1-4].fastq` and `seq 12 14`) – BCArg Sep 23 '19 at 13:05

2 Answers2

5
  1. Don't Parse ls

  2. xargs does not support two placeholders.

  3. Use a for loop. Actually, two loops (one for the filenames, and one for the 12..14 sequence).

    For example:

#!/bin/bash

for f in barcode0[1-4].fastq; do
  bn="$(basename "$f" .fastq)"
  for k in {12..14}; do
    krocus --verbose --output_file "out_krocus/${bn}_${k}Ecoli1.txt" \
      /nexusb/Gridion/MLST_krocus_DBs/e_coli1 --kmer "$k" "$f"
  done
done
cas
  • 1
  • 7
  • 119
  • 185
0

Using GNU Parallel it looks like this:

parallel krocus --verbose --output_file out_krocus/{1.}_{2}Ecoli1.txt /nexusb/Gridion/MLST_krocus_DBs/e_coli1 --kmer {2} {1} ::: barcode0[1-4].fastq ::: {12..14}
Ole Tange
  • 33,591
  • 31
  • 102
  • 198