A POSIX-compliant AWK interpreter written in Go, with CSV support
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗AWK is a fascinating text-processing language, and somehow after reading the delightfully-terse The AWK Programming Language I was inspired to write an interpreter for it in Go. So here it is, feature-complete and tested against "the one true AWK" and GNU AWK test suites.
GoAWK is a POSIX-compatible version of AWK, and additionally has a CSV mode for reading and writing CSV and TSV files (read the CSV documentation).
You can also read one of the articles I've written about GoAWK:
To use the command-line version, download one of the release binaries. You can also use go install to build and install it from source, and then run it using goawk (assuming ~/go/bin is in your PATH):
$ go install github.com/benhoyt/goawk@latest
$ goawk 'BEGIN { print "foo", 42 }'
foo 42
$ echo 1 2 3 | goawk '{ print $1 + $3 }'
4
# Or use GoAWK's CSV and @"named-field" support:
$ echo -e 'name,amount\nBob,17.50\nJill,20\n"Boba Fett",100.00' | \
goawk -i csv -H '{ total += @"amount" } END { print total }'
137.5
To use it in your Go programs, you can call interp.Exec directly for simple needs:
input := strings.NewReader("foo bar\n\nbaz buz")
err := interp.Exec("$0 { print $1 }", " ", input, nil)
if err != nil {
fmt.Println(err)
return
}
// Output:
// foo
// baz
Or you can use parser.ParseProgram and then interp.ExecProgram to control execution, set variables, and so on:
src := "{ print NR, tolower($0) }"
input := "A\naB\nAbC"
prog, err := parser.ParseProgram([]byte(src), nil)
if err != nil {
fmt.Println(err)
return
}
config := &interp.Config{
Stdin: strings.NewReader(input),
Vars: []string{"OFS", ":"},
}
_, err = interp.ExecProgram(prog, config)
if err != nil {
fmt.Println(err)
return
}
// Output:
// 1:a
// 2:ab
// 3:abc
If you need to repeat execution of the same program on different inputs, you can call interp.New once, and then call the returned object's Execute method as many times as you need.
Read the Go package documentation for more details.
Read GoAWK's documentation for more information about specific topics:
My intention is for GoAWK to conform to awk's behavior and to the POSIX AWK spec, but this section describes some areas where it's different.
Additional features GoAWK has over AWK:
awk and gawk recently added basic CSV support too, with the --csv option.$-1 refers to the last field.awk and on a par with gawk, though usually slower than mawk.'single-quoted strings' in addition to "double-quoted strings", primarily to make Windows one-liners easier when using the cmd.exe shell (which uses " as the quote character).Things AWK has over GoAWK:
regexp package is relatively slow).This project has a good suite of tests, which include my own intepreter tests, the original AWK test suite, and the relevant tests from the Gawk test suite. I've used it a bunch personally, and it's used in the Redpanda Connect (formerly "Benthos") stream processor as well as by the software team at the library of the University of Antwerp. However, to err == human, so please use GoAWK at your own risk. I intend not to change the Go API in a breaking way in any v1.x.y version.
The GoAWK repository also includes AWKGo, an AWK-to-Go compiler. This is experimental and is not subject to the stability requirements of GoAWK itself. You can read more about AWKGo or browse the code on the awkgo branch.
GoAWK is licensed under an open source MIT license.
Have fun, and please contact me if you're using GoAWK or have any feedback!