diff --git a/gnu/packages/gawk.scm b/gnu/packages/gawk.scm
index f0e034b750..4d74f6d47e 100644
--- a/gnu/packages/gawk.scm
+++ b/gnu/packages/gawk.scm
@@ -23,12 +23,16 @@
 (define-module (gnu packages gawk)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (gnu packages)
+  #:use-module (gnu packages base)
   #:use-module (gnu packages bash)
+  #:use-module (gnu packages gcc)
   #:use-module (gnu packages libsigsegv)
   #:use-module (gnu packages multiprecision)
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix git-download)
+  #:use-module (guix utils)
+  #:use-module (guix build-system copy)
   #:use-module (guix build-system gnu))

 (define-public gawk
@@ -160,3 +164,93 @@ (define-public mawk
 This version aims to be smaller and faster than GNU Awk, at the expense
 of fewer features and extensions.")
     (license license:gpl2))) ;version 2 only
+
+(define-public cppawk
+  (package
+    (name "cppawk")
+    (version "20220703")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://www.kylheku.com/cgit/cppawk/")
+             ;; The version isn't tagged.
+             (commit "99fcf1f7e633bea1dcb678382a3adbd845920f69")))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "19g773aybvr2g02bw91v8ygmvqlrlv2bpp4bk3svqfrhxbrhr0fl"))))
+    (build-system copy-build-system)
+    (arguments
+     `(#:install-plan '(("bin/cppawk" "bin/cppawk")
+                        ("share/cppawk/include" "share/cppawk/include")
+                        ("./" "share/man/man1" #:include-regexp (".*\\.1$")))
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'fix-paths
+           (lambda _
+             (substitute* "bin/cppawk"
+               (("/bin/bash") (which "bash"))
+               (("dirname") (which "dirname"))
+               (("mktemp") (which "mktemp"))
+               ;; Extra space to prevent matching Awk's printf.
+               (("printf ") (string-append (which "printf") " "))
+               (("rm -f") (string-append (which "rm") " -f"))
+               (("prepro=cpp") (string-append "prepro=" (which "cpp")))
+               (("sed -e") (string-append (which "sed") " -e")))
+             (substitute* "runtests"
+               (("--awk=mawk") (string-append "--awk=" (which "mawk")))
+               (("rm -f") (string-append (which "rm") " -f")))
+             (substitute* "testcases"
+               (("grep") (which "grep")))
+             (substitute* "testsuite.awk"
+               (("cat output") (string-append (which "cat") " output"))
+               (("sh script.sh") (string-append (which "bash") " script.sh")))))
+         (add-after 'fix-paths 'fix-awk-paths
+           (lambda _
+             (substitute* "bin/cppawk"
+               (("awk=gawk") (string-append "awk=" (which "gawk")))
+               (("awk '") (string-append (which "gawk") " '")))))
+         (add-after 'build 'check
+           (lambda _
+             (invoke "./runtests"))))))
+    (native-inputs
+     ;; For tests
+     (list mawk))
+    (inputs
+     (list coreutils                    ; For dirname, mktemp, printf, rm
+           gawk-mpfr                    ; Default variant, but supports others
+           gcc                          ; For cpp
+           sed))
+    (home-page "https://www.kylheku.com/cgit/cppawk/")
+    (synopsis "Wrapper script that adds C preprocessing to Awk")
+    (description
+     "@command{cppawk} is a shell script that invokes the C preprocessor
+(@command{cpp}) on Awk code and calls Awk (by default GNU Awk) on the result.
+
+@command{cppawk} understands the basic Awk options like @option{-F} and
+@option{-v}, and also understands common @command{cpp} options like
+@option{-I} and @option{-Dmacro=value}.
+
+@command{cppawk} has no dependencies beyond Awk, @command{cpp}, @command{sed}
+and some GNU core utilities (including @command{printf}).  Preprocessed
+programs can be captured and transferred to systems that have Awk but not
+@command{cpp} or @command{cppawk}.")
+    (license license:bsd-2)))
+
+(define-public cppawk-egawk
+  (package/inherit cppawk
+    (name "cppawk-egawk")
+    (arguments
+     (substitute-keyword-arguments (package-arguments cppawk)
+       ((#:phases phases)
+        `(modify-phases ,phases
+           (replace 'fix-awk-paths
+             (lambda _
+               (substitute* "bin/cppawk"
+                 (("awk=gawk") (string-append "awk=" (which "egawk")))
+                 (("awk '") (string-append (which "egawk") " '")))))))))
+    (inputs
+     (modify-inputs (package-inputs cppawk)
+       (delete "gawk-mpfr")
+       (prepend egawk-next)))
+    (synopsis "cppawk that calls Enhanced GNU Awk by default")))
