2

I just started using gnu-parallel. I am trying to feed parallel with several variables. Suppose I have a text file (foo.txt) with the content below,

> cat foo.txt
a b c
d e f

Now, if I run the below command,

> range=$(eval echo {10..15})
> parallel -a foo.txt --colsep=' ' echo {} {#} {1} {2} {3} ::: $range

instead of getting,

10 1 a b c
11 2 a b c
12 3 a b c
13 4 a b c
14 5 a b c
15 6 a b c
10 7 d e f
11 8 d e f
12 9 d e f
14 11 d e f
15 12 d e f
13 10 d e f

I get this,

a b c 10 1 a b c
a b c 11 2 a b c
a b c 12 3 a b c
a b c 13 4 a b c
a b c 14 5 a b c
a b c 15 6 a b c
d e f 10 7 d e f
d e f 11 8 d e f
d e f 12 9 d e f
d e f 14 11 d e f
d e f 15 12 d e f
d e f 13 10 d e f

How can I do it right?

1 Answer 1

5

{} is the complete input line, which are generated by doing a Cartesian product of all input sources - the lines of the file and the command line arguments. If you just want the number portion of each line, it ends up being the fourth column, which you'd have to refer to like you do the other columns:

$ range=( {10..15} )
$ parallel -a foo.txt --colsep=' ' echo {4} {#} {1} {2} {3} ::: "${range[@]}"
10 1 a b c
11 2 a b c
12 3 a b c
13 4 a b c
14 5 a b c
15 6 a b c
10 7 d e f
11 8 d e f
12 9 d e f
13 10 d e f
14 11 d e f
15 12 d e f

Also note using an array for the range variable to avoid that ugly eval echo.

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.