Source: https://igppweb.ucsd.edu/~agnew/Courses/Sio233/sio233.notes.awk.pdf