Awk substr query

Hello,
I'm a newbie so forgive me if I am doing something silly. I have a string passed into my shell script as an argument. I only want every other character of this string.

while [ $num -le $inputlength ]
do
  echo $num
  echo $inputpass| awk '{print substr($0,$num,1)}'
  let num=$num+2
done

The thing is, the substr function does not seem to recognise the $num variable. The only thing that is displayed is the first character of the input string. Is there something I need to do to $num so that the substr procedure can see it?

TIA

John
johnster_ukAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

 
glassdCommented:
Why not do the whole thing in awk. Assuming you want all the characters on one line:

echo $inputpass | awk '{
   for(i=1;i<=length($0);i+=2) {
      printf("%s",substr($0,i,1))
   }
   printf("\n")
}'

You can do something like this in ksh:

Length=${#inputpass}
i=1
while (( $i <= $Length ))
do
   Char=$(echo $inputpass | cut -c$i)
   printf "%s" $Char
   (( i = i + 2 ))
done
print "\n"

But if you really want to do it your way, why not do this:

while [ $num -le $inputlength ]
do
  echo "$inputpass $num" | awk '{print substr($1,$2,1)}'
  let num=$num+2
done

Note the alternative addition syntaxes available

You cannot see your shell variables inside awk, so you have to pass them in. There are a few ways. One is to include them on the input line as shown above (this assumes that $inputpass cannot include spaces or tabs). Another is to set them to a variable, like this:

echo $inputpass | awk -v a=$num '{print substr($0,$num,1)}'

Hope this helps.



0

Experts Exchange Solution brought to you by ConnectWise

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
 
JJSmithCommented:

Whilst there is nothing wrong with the good answer(s) supplied by glassd, it depends on the percieved question. ie.
        "Is there something I need to do to $num so that the substr procedure can see it?"

Well yes there is, $num is a shell variable, awk has it's own set of variables, as demonstated by glassd you can assign the shell variable to an awk variable as you enter the awk process.

        echo $inputpass | awk -v awkvar=$num '{print substr($0,awkvar,1)}'

Because of the 2 variable types appearing on the same command line, we protect the awk variables , ( the $ prefixed ones ), by enclosing the awk commands in single quotes to stop the shell trying to evaluate the $ variables. In your case you wanted the shell to evaluate $num before the awk command line is executed.

In short your original code was OK except you didn't want to protect the $num.

ie
echo $inputpass| awk '{print substr($0,$num,1)}'
becomes
echo $inputpass| awk '{print substr($0,'$num',1)}'

Try it

Cheers
JJ







0
 
glassdCommented:
Would you believe it. All the time I have been using awk and I didn't know you could do that. Just shows, you're never too old to learn.

Thanks JJ
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.