Snie3vel
Snie3vel

Reputation: 23

How can I use 'echo' output as an operand for the 'seq' command within a terminal?

I have an excercise where I need to sum together every digit up until a given number like this:

Suppose I have the number 12, I need to do 1+2+3+4+5+6+7+8+9+1+0+1+1+1+2.

(numbers past 9 are split up into their separate digits eg. 11 = 1+1, 234 = 2+3+4, etc.)

I know I can just use:

seq -s '' 12

which outputs 123456789101112 and then add them all together with '+' in between and then pipe to 'bc' BUT I have to specifically do :

echo 12 | ...

as the first step (because the online IDE fills it in as the unchangeable first step for every testcase) and when I do this I start to have problems with seq

I tried

echo 12 | seq -s '' $1

### or just ###

echo 12 | seq -s '' 

but can't get it to work as this just gives back a missing operand error for seq (because I'm in the terminal, not a script and the '12' isn't just assigned to $1 I assume), any recommendations on how to avoid it or how to get seq to interpret the 12 from echo as operand or alternative ways to go?

Upvotes: 0

Views: 164

Answers (3)

Snie3vel
Snie3vel

Reputation: 23

seq -s '' $(cat)

full solution:

echo "12" | seq -s '' $(cat) | sed 's/./&+/g; s/$/0/' | bc

Upvotes: 2

dawg
dawg

Reputation: 103844

echo 12 | awk '{
cnt=0
for(i=1;i<=$1;i++) {
    cnt+=i
    printf("%s%s",i,i<$1?"+":"=")
    }
    print cnt
}'

Prints:

1+2+3+4+5+6+7+8+9+10+11+12=78

If it is supposed to be just the digits added up:

echo 12 | awk '{s=""
                for(i=1;i<=$1;i++) s=s i 
                split(s,ch,"")
                for(i=1;i<=length(ch); i++) cnt+=ch[i]
                print cnt
}'
51

Or a POSIX pipeline:

$ echo 12 | seq -s '' "$(cat)" | sed -E 's/([0-9])/\1+/g; s/$/0/' | bc
51

Upvotes: 1

Diego Torres Milano
Diego Torres Milano

Reputation: 69218

Or

echo 12 | { echo $(( $({ seq -s '' $(< /dev/stdin); echo; } | sed -E 's/([[:digit:]])/\1+/g; s/$/0/') )); }

without sed:

d=$(echo 12 | { seq -s '' $(< /dev/stdin); echo; }); echo $(( "${d//?/&+}0" ))

Upvotes: 1

Related Questions