Awk substr query

johnster_uk used Ask the Experts™
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 ]
  echo $num
  echo $inputpass| awk '{print substr($0,$num,1)}'
  let num=$num+2

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?


Watch Question

Do more with

Expert Office
EXPERT OFFICE® is a registered trademark of EXPERTS EXCHANGE®
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) {

You can do something like this in ksh:

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

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

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

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.


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.

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

Try it


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

Do more with

Expert Office
Submit tech questions to Ask the Experts™ at any time to receive solutions, advice, and new ideas from leading industry professionals.

Start 7-Day Free Trial