An Awk program to find all primes till N I developed Awk code to print all primes till N where N is given as command line argument. I think I took pretty much all the optimizations into account. Could someone help if it could be optimized even more. The code is as follows:

#!/usr/bin/awk -f

BEGIN{
  for (i=oddify(ARGV[1]); i&gt;2; i=i-2){
    flag=1 #prime
    for(j=3; j&lt;=ceil(sqrt(i)); j=j+2){
      if (i%j==0){
        flag=0 #not prime
        break
      }
    }
    if (flag==1){printf("%d\n", i) }
  }
  printf("2\n")
}

function ceil(n){
  return (n == int(n)) ? n : int(n)+1
}

function oddify(n){
  return (n%2 != 0) ? n : n-1
}


How to run: awk -f prime.awk 10000
Bug: when I run the program with argument 1, it prints 2 even though 2 > 1.

The code is not optimized at all. It computes ceil and sqrt way too often, in a way that is obvious to optimize. All other prime programs on this site already do that, have a look at them.

The code is not optimized enough. It contains i = i + 2, which should have been i += 2 from the beginning. A third of these calls can be omitted using the standard prime searching technique that has been mentioned more than enough on this site.

The variable name flag is terrible. It should be is_prime instead.

Having the most interesting code in the BEGIN block is bad design. You should define a function is_prime and another function print_primes_up_to. This allows you to declare i and j as local variables.

In the function ceil, the parameter name n is confusing since this name implies to the human reader that it is a natural number. In reality it is a floating point number though. A better name for this variable is x.

The code is missing some documentation. It should clearly state up to which number it reports correct results. It should also state the first number for which a wrong result is printed. Internally, many AWK implementations use 64-bit floating point numbers, therefore I guess this number is somewhere around \$2^{53}\$.