Search code examples
bashiteratorglobprepend

How to prepend -A, -B, and -C to the names of files in bash? Similar to Python's zip function


I'm trying to do the following in bash:

>>> import glob
>>> FILES = glob.glob("testing_output/test/intermediate/metawrap_output/initial_binning/*_bins")
>>> " ".join(map(lambda x:" ".join(x), zip(["-A", "-B", "-C"], FILES)))
'-A testing_output/test/intermediate/metawrap_output/initial_binning/maxbin2_bins -B testing_output/test/intermediate/metawrap_output/initial_binning/concoct_bins -C testing_output/test/intermediate/metawrap_output/initial_binning/metabat2_bins'

I can get to the FILES part but I can't figure out how to get the last line. The reason I want to do this is that sometimes the number of files in FILES will be 1-3. Hopefully 3, but sometimes it will be 2 or 1.

My question, how can I essentially prepend -A, -B, and -C depending on how many files are available?

Maybe this will help:

FILES=("testing_output/test/intermediate/metawrap_output/initial_binning/concoct_bins" "testing_output/test/intermediate/metawrap_output/initial_binning/maxbin2_bins" "testing_output/test/intermediate/metawrap_output/initial_binning/metabat2_bins")

echo ${FILES[*]}
testing_output/test/intermediate/metawrap_output/initial_binning/concoct_bins testing_output/test/intermediate/metawrap_output/initial_binning/maxbin2_bins testing_output/test/intermediate/metawrap_output/initial_binning/metabat2_bins

I was able to do this:

python -c """import glob; FILES = glob.glob('testing_output/test/intermediate/metawrap_output/initial_binning/*_bins'); print(' '.join(map(lambda x:' '.join(x), zip(['-A', '-B', '-C'], FILES))))"""

but I couldn't figure out how to save it to a bash variable.


Solution

  • files=("testing_output/test/intermediate/metawrap_output/initial_binning/concoct_bins" "testing_output/test/intermediate/metawrap_output/initial_binning/maxbin2_bins" "testing_output/test/intermediate/metawrap_output/initial_binning/metabat2_bins")
    letters=({A..Z})
    
    for ((i=0; i<${#files[@]}; i++)); do echo "-${letters[$i]} ${files[$i]}"; done
    

    Output:

    -A testing_output/test/intermediate/metawrap_output/initial_binning/concoct_bins
    -B testing_output/test/intermediate/metawrap_output/initial_binning/maxbin2_bins
    -C testing_output/test/intermediate/metawrap_output/initial_binning/metabat2_bins