[The Original Shootout]   [NEWS]   [FAQ]   [Methodology]   [Platform Details]   [Acknowledgements]   [Scorecard]
All Source For awka
Ackermann's Function
```# \$Id: ackermann.gawk,v 1.6 2001/05/20 06:12:59 doug Exp \$
# http://www.bagley.org/~doug/shootout/

function ack(m, n) {
if (m == 0) return( n + 1 );
if (n == 0) return( ack(m - 1, 1) );
return( ack(m - 1, ack(m, (n - 1))) );
}

BEGIN {
n = (ARGV[1] < 1) ? 1 : ARGV[1];
printf("Ack(3,%d): %d\n", n, ack(3, n));
exit;
}
```
Array Access
```# \$Id: ary3.gawk,v 1.1 2001/05/31 02:27:48 doug Exp \$
# http://www.bagley.org/~doug/shootout/

# this program modified from:
#   http://cm.bell-labs.com/cm/cs/who/bwk/interps/pap.html
# Timing Trials, or, the Trials of Timing: Experiments with Scripting
# and User-Interface Languages</a> by Brian W. Kernighan and
# Christopher J. Van Wyk.

BEGIN {
n = (ARGV[1] < 1) ? 1 : ARGV[1];

for (i = 0; i < n; i++)
x[i] = i + 1
for (k = 0; k < 1000; k++) {
for (j = n-1; j >= 0; j--)
y[j] += x[j]
}

print y[0], y[n-1]
}
```
Count Lines/Words/Chars
```# \$Id: wc.gawk,v 1.3 2001/05/25 03:21:20 doug Exp \$
# http://www.bagley.org/~doug/shootout/

# this program modified from:
#   http://cm.bell-labs.com/cm/cs/who/bwk/interps/pap.html
# Timing Trials, or, the Trials of Timing: Experiments with Scripting
# and User-Interface Languages</a> by Brian W. Kernighan and
# Christopher J. Van Wyk.

# this version is a little more efficient than the original via
# use of NR

BEGIN { delete ARGV }
{
nc += length(\$0) + 1
nw += NF
}
END { print NR, nw, nc }
```
Fibonacci Numbers
```# \$Id: fibo.gawk,v 1.4 2001/05/20 06:13:00 doug Exp \$
# http://www.bagley.org/~doug/shootout/

function fib(n) {
if (n < 2) return(1);
return(fib(n-2) + fib(n-1));
}

BEGIN {
n = (ARGV[1] < 1) ? 1 : ARGV[1];
printf("%d\n", fib(n));
exit;
}
```
Hash (Associative Array) Access
```# \$Id: hash.gawk,v 1.3 2001/05/20 06:13:00 doug Exp \$
# http://www.bagley.org/~doug/shootout/

# this program modified from:
#   http://cm.bell-labs.com/cm/cs/who/bwk/interps/pap.html
# Timing Trials, or, the Trials of Timing: Experiments with Scripting
# and User-Interface Languages</a> by Brian W. Kernighan and
# Christopher J. Van Wyk.

BEGIN {
n = (ARGV[1] < 1) ? 1 : ARGV[1];

for (i = 1; i <= n; i++)
x[sprintf("%x", i)] = i
for (i = n; i > 0; i--)
if (i in x)
c++
print c
}
```
Hashes, Part II
```# \$Id: hash2.gawk,v 1.2 2001/05/20 06:13:00 doug Exp \$
# http://www.bagley.org/~doug/shootout/

BEGIN {
n = (ARGV[1] < 1) ? 1 : ARGV[1];

for (i=0; i<10000; i++)
hash1[sprintf("foo_%d", i)] = i
for (i=0; i<n; i++)
for (k in hash1)
hash2[k] += hash1[k]
print hash1["foo_1"], hash1["foo_9999"], hash2["foo_1"], hash2["foo_9999"]
}
```
Heapsort
```# \$Id: heapsort.gawk,v 1.3 2001/05/20 06:13:00 doug Exp \$
# http://www.bagley.org/~doug/shootout/

function gen_random(n) { return( (n * (LAST = (LAST * IA + IC) % IM)) / IM ); }

function heapsort (n, ra) {
l = int(0.5+n/2) + 1
ir = n;
for (;;) {
if (l > 1) {
rra = ra[--l];
} else {
rra = ra[ir];
ra[ir] = ra[1];
if (--ir == 1) {
ra[1] = rra;
return;
}
}
i = l;
j = l * 2;
while (j <= ir) {
if (j < ir && ra[j] < ra[j+1]) { ++j; }
if (rra < ra[j]) {
ra[i] = ra[j];
j += (i = j);
} else {
j = ir + 1;
}
}
ra[i] = rra;
}
}

BEGIN {
IM = 139968;
IA = 3877;
IC = 29573;
LAST = 42;

n = (ARGV[1] < 1) ? 1 : ARGV[1];
ary[0] = 0;
for (i=1; i<=n; i++) {
ary[i] = gen_random(1.0);
}

heapsort(n, ary);

printf("%.10f\n", ary[n]);

exit;
}
```
Hello World
```# \$Id: hello.gawk,v 1.1 2001/06/17 22:00:34 doug Exp \$
# http://www.bagley.org/~doug/shootout/

BEGIN { print "hello world" }
```
Matrix Multiplication
```# \$Id: matrix.gawk,v 1.1 2001/05/20 06:59:20 doug Exp \$
# http://www.bagley.org/~doug/shootout/

function mkmatrix(mx, rows, cols) {
count = 1;
for (i=0; i<rows; i++) {
for (j=0; j<cols; j++) {
mx[i,j] = count++;
}
}
}

function mmult(rows, cols, m1, m2, m3) {
for (i=0; i<rows; i++) {
for (j=0; j<cols; j++) {
val = 0;
for (k=0; k<cols; k++) {
val += m1[i,k] * m2[k,j];
}
m3[i,j] = val;
}
}
}

BEGIN {
n = (ARGV[1] < 1) ? 1 : ARGV[1];
size = 30;
m1[0,0] = 0;
m2[0,0] = 0;
mkmatrix(m1, size, size);
mkmatrix(m2, size, size);
mm[0,0] = 0;
for (l=0; l<n; l++) {
mmult(size, size, m1, m2, mm);
}
printf("%d %d %d %d\n", mm[0,0], mm[2,3], mm[3,2], mm[4,4]);
exit;
}
```
Nested Loops
```# \$Id: nestedloop.gawk,v 1.2 2001/05/20 06:13:00 doug Exp \$
# http://www.bagley.org/~doug/shootout/

BEGIN {
n = (ARGV[1] < 1) ? 1 : ARGV[1];

for (a=0; a<n; a++)
for (b=0; b<n; b++)
for (c=0; c<n; c++)
for (d=0; d<n; d++)
for (e=0; e<n; e++)
for (f=0; f<n; f++)
x += 1
print x
}
```
Random Number Generator
```# \$Id: random.gawk,v 1.6 2001/05/25 03:11:25 doug Exp \$
# http://www.bagley.org/~doug/shootout/

function gen_random(max) { return( (max * (LAST = (LAST * IA + IC) % IM)) / IM ); }

BEGIN {
IM = 139968;
IA = 3877;
IC = 29573;
LAST = 42;

n = (ARGV[1] < 1) ? 1 : ARGV[1];
n--
while (n--) {
gen_random(100);
}
printf("%.9f\n", gen_random(100));
exit;
}
```
Regular Expression Matching
```# \$Id: regexmatch.gawk,v 1.2 2001/05/20 06:13:00 doug Exp \$
# http://www.bagley.org/~doug/shootout/

BEGIN {
n = (ARGV[1] < 1) ? 1 : ARGV[1];
delete ARGV;
}

{ phones[p++] = \$0; }

END {
for (i=0; i<n; i++) {
for (j=0; j<p; j++) {
line = phones[j];
if (match(line, /(^|[^0-9])(\([0-9][0-9][0-9]\)|[0-9][0-9][0-9]) [0-9][0-9][0-9][ -][0-9][0-9][0-9][0-9](\$|[^0-9])/)) {
m1 = substr(line, RSTART, RLENGTH);
num = ""
if (match(m1, /[0-9][0-9][0-9] [0-9][0-9][0-9][ -][0-9][0-9][0-9][0-9]/)) {
if (substr(m1, RSTART-1, 1) == "(") {
break;
}
if (x = split(substr(m1, RSTART, RLENGTH), parts, /[ -]/)) {
num = "(" parts[1] ") " parts[2] "-" parts[3];
}
} else if (match(m1, /\([0-9][0-9][0-9]\) [0-9][0-9][0-9][ -][0-9][0-9][0-9][0-9]/)) {
if (x = split(substr(m1, RSTART, RLENGTH), parts, /[ -]/)) {
num = parts[1] " " parts[2] "-" parts[3];
}
}
if (i == (n-1)) {
count++;
printf("%d: %s\n", count, num);
}
}
}
}
}
```
Reverse a File
```# \$Id: reversefile.gawk,v 1.2 2000/11/22 20:54:57 doug Exp \$
# http://www.bagley.org/~doug/shootout/

BEGIN { delete ARGV }
{ x[NR] = \$0 }
END { for (i = NR; i >= 1; i--)
print x[i]
}
```
Sieve of Erathostenes
```# \$Id: sieve.gawk,v 1.10 2001/05/25 03:33:08 doug Exp \$
# http://www.bagley.org/~doug/shootout/

BEGIN {
n = (ARGV[1] < 1) ? 1 : ARGV[1];
while (n--) {
count=0;
for(i=2; i <= 8192; flags[i++]=1);
for (i=2; i <= 8192; i++) {
if (flags[i]) {
# remove all multiples of prime: i
for (k=i+i; k <= 8192; k+=i) {
flags[k] = 0;
}
count++;
}
}
}
printf("Count: %d\n", count);
exit;
}
```
Spell Checker
```# \$Id: spellcheck.gawk,v 1.3 2001/05/20 06:13:00 doug Exp \$
# http://www.bagley.org/~doug/shootout/

BEGIN {
delete ARGV;
while (getline < "Usr.Dict.Words") {
dict[\$0] = 1;
}
}
{
if (!dict[\$1]) {
print \$1
}
}
```
Statistical Moments
```# \$Id: moments.gawk,v 1.1 2001/05/13 07:09:06 doug Exp \$
# http://www.bagley.org/~doug/shootout/

BEGIN {
delete ARGV;
sum = 0;
n = 0;
}

{
nums[n++] = \$1;
sum += \$1;
}

END {
mean = sum/n;
for (num in nums) {
dev = nums[num] - mean;
if (dev > 0) { avg_dev += dev; } else { avg_dev -= dev; }
vari += dev^2;
skew += dev^3;
kurt += dev^4;
}
avg_dev /= n;
vari /= (n - 1);
std_dev = sqrt(vari);

if (vari > 0) {
skew /= (n * vari * std_dev);
kurt = kurt/(n * vari * vari) - 3.0;
}

nums[n] = nums[0];
heapsort(n, nums);

mid = int(n/2)+1;
median = (n % 2) ? nums[mid] : (nums[mid] + nums[mid-1])/2;

printf("n:                  %d\n", n);
printf("median:             %f\n", median);
printf("mean:               %f\n", mean);
printf("average_deviation:  %f\n", avg_dev);
printf("standard_deviation: %f\n", std_dev);
printf("variance:           %f\n", vari);
printf("skew:               %f\n", skew);
printf("kurtosis:           %f\n", kurt);
}

function heapsort (n, ra) {
l = int(0.5+n/2) + 1
ir = n;
for (;;) {
if (l > 1) {
rra = ra[--l];
} else {
rra = ra[ir];
ra[ir] = ra[1];
if (--ir == 1) {
ra[1] = rra;
return;
}
}
i = l;
j = l * 2;
while (j <= ir) {
if (j < ir && ra[j] < ra[j+1]) { ++j; }
if (rra < ra[j]) {
ra[i] = ra[j];
j += (i = j);
} else {
j = ir + 1;
}
}
ra[i] = rra;
}
}
```
String Concatenation
```# \$Id: strcat.gawk,v 1.3 2001/05/20 06:13:00 doug Exp \$
# http://www.bagley.org/~doug/shootout/

BEGIN {
n = (ARGV[1] < 1) ? 1 : ARGV[1];

str = ""
for (i = 0; i < n; i++)
str = str "hello\n"

print length(str)
}
```
Sum a Column of Integers
```# \$Id: sumcol.gawk,v 1.2 2000/10/07 08:41:44 doug Exp \$
# http://www.bagley.org/~doug/shootout/

BEGIN { delete ARGV; tot = 0 }
{ tot += \$1 }
END { print tot }
```
Word Frequency Count
```# \$Id: wordfreq.gawk,v 1.2 2001/05/20 06:13:00 doug Exp \$
# http://www.bagley.org/~doug/shootout/

BEGIN {
delete ARGV;
FS = "[^A-Za-z][^A-Za-z]*";
}
{
for (i=1; i<=NF; i++) {
freq[tolower(\$(i))]++;
}
}
END {
# gawk doesn't have a builtin sort routine
# so we have to pipe through the shell sort program
sort = "/bin/sort -nr"
for (word in freq) {
if (word) {
printf "%7d\t%s\n", freq[word], word | sort
}
}
close(sort)
}
```