#!/usr/bin/nawk -f BEGIN { number = "^[-+]?([0-9]+[.]?[0-9]*|[.][0-9]+)" \ "([eE][-+]?[0-9]+)?$" first = 1; natoms = 0; ANG_TO_DEBYE = 4.802813198; } !isdata($1,$2,$3,$4,$5) { if (!first) exit; first = 0; next; } { natoms++; an[natoms] = $1; x[natoms] = $2; y[natoms] = $3; z[natoms] = $4; charge[natoms] = $5; } END { if (natoms == 0) { printf("No atoms found.\n"); exit; } # calculate net charge and dipole moment netcharge = 0.0; dipx = dipy = dipz = 0.0; for(i=1;i<=natoms;i++) { dipx += charge[i] * (x[i] - x[1]); dipy += charge[i] * (y[i] - y[1]); dipz += charge[i] * (z[i] - z[1]); netcharge += charge[i]; } dipole = sqrt(dipx*dipx + dipy*dipy + dipz*dipz); # converts to debyes when distances are in angstroms dipole *= ANG_TO_DEBYE; printf("Net charge = % 10.6f\n", netcharge); printf("Dipole moment = % 10.6f Debye\n", dipole); } function isdata (s1, s2, s3, s4, s5) { if (match(s1, number) && match(s2, number) && match(s3, number) && match(s4, number) && match(s5, number)) return 1; else return 0; }