What you wrote is absolutely not what you want. Your awk
program parses each line of the input and computes only one number per line which happens to be 10 times the integer you would see if you were writing the 0's and 1's in reverse order. So, for a line like:
1 0 0 1 0 1
your awk
program computes 10+0+0+10000+0+1000000=1010010. As you can see, this is the same as 10 times 101001 (100101 reversed).
To do what you want you can loop over all fields and modify them on the fly by multiplying them by the corresponding power of 10, as shown in the an other answer.
Note: another awk
solution, a bit more compact, but strictly equivalent for your inputs, could be:
awk '{for(i=1;i<=NF;i++) $i*=10**(i-1)} {print}' test.txt
The first block loops over the fields and modifies them on the fly by multiplying them by the corresponding power of 10. The second block prints the modified line.
As noted in an other answer there is a potential overflow issue with the pure arithmetic approach. If you have lines with many fields you could hit the maximum of integer representation in floating point format. It could be that the strange 1024
values in the output you show are due to this.
If there is a risk of overflow, as suggested in the other answer, you could use another approach where the trailing zeroes are added not by multiplying by a power of 10, but by concatenating value 0 represented on the desired number of digits, something that printf
and sprintf
can do:
$ awk 'BEGIN {printf("%s%0.*d\n",1,4,0)}' /dev/null
10000
So, a GNU awk solution based on this could be:
awk '{for(i=1;i<=NF;i++) $i = $i ? sprintf("%s%0.*d",$i,i-1,0) : $i} 1' test.txt