ts-awk
v1.0.4
Published
A TypeScript implementation of AWK text processing language
Downloads
254
Maintainers
Readme
ts-awk
A TypeScript implementation of AWK, the classic text processing language. Usable as a CLI tool or as a library.
Installation
npm install -g ts-awkOr as a project dependency:
npm install ts-awkCLI Usage
tsawk [options] 'program' [file ...]Options
| Flag | Description |
|------|-------------|
| -F sep | Set the field separator (default: whitespace) |
| -v var=value | Assign a variable before execution |
| -f progfile | Read the AWK program from a file |
Examples
# Print the first field of each line
tsawk '{ print $1 }' data.txt
# Sum a column
tsawk '{ total += $2 } END { print total }' data.txt
# Custom field separator
tsawk -F: '{ print $1, $3 }' /etc/passwd
# Filter with pattern matching
tsawk '/error/i { print NR, $0 }' log.txt
# Multiple rules
tsawk 'BEGIN { print "Name,Age" } $2 > 25 { print $1 "," $2 }' data.txt
# Read from stdin
cat data.txt | tsawk '{ print NF }'Library Usage
import { Lexer, Parser, Interpreter } from 'ts-awk';
const program = '{ total += $2 } END { print total }';
const input = 'Alice 30\nBob 25\nCharlie 35\n';
const tokens = new Lexer(program).tokenize();
const ast = new Parser(tokens).parse();
let output = '';
const interpreter = new Interpreter(ast, {
stdinData: input,
output: (text) => { output += text; },
});
interpreter.run();
console.log(output); // "90\n"Supported Features
- Field splitting —
$0,$1..$NF, custom separators via-ForFS - Patterns —
BEGIN,END,/regex/, comparison expressions,~,!~ - Multiple rules — each input line is checked against every rule
- Variables — dynamically typed, automatic string/number coercion
- Arithmetic —
+,-,*,/,%,^, compound assignment (+=, etc.) - String concatenation — implicit (juxtaposition)
- Control flow —
if/else,while,for,do-while,break,continue,next,exit, ternary (?:) - Associative arrays —
arr[key],for (k in arr),delete,in - printf / sprintf —
%d,%f,%s,%c,%x,%o,%e,%gwith width and precision - String functions —
length,substr,index,split,sub,gsub,match,sprintf,tolower,toupper - Math functions —
int,sqrt,sin,cos,atan2,exp,log,rand,srand - User-defined functions —
function name(params) { body }withreturnand local variables - Output variables —
OFS,ORS,RS - Built-in variables —
NR,NF,FS,FILENAME,ARGC,ARGV,RSTART,RLENGTH - I/O —
print ... | "cmd",print ... > "file",print ... >> "file",getline,close() - Multiple input files
Development
git clone https://github.com/scottobert/ts-awk.git
cd ts-awk
npm install
npm run build
npm testScripts
| Command | Description |
|---------|-------------|
| npm run build | Compile TypeScript to dist/ |
| npm test | Run all tests |
| npm run test:coverage | Run tests with coverage report |
Project Structure
src/
lexer.ts Tokenizer
parser.ts Recursive-descent parser
ast.ts AST type definitions
interpreter.ts Tree-walking interpreter
builtins.ts Built-in string and math functions
formatter.ts printf/sprintf formatting
cli.ts CLI entry point
index.ts Library exports
tests/
lexer.test.ts Lexer unit tests
parser.test.ts Parser unit tests
interpreter.test.ts Interpreter unit tests
cli.test.ts CLI end-to-end tests
integration/ Feature tests (one file per AWK feature area)License
MIT
