Skip to content

scottobert/ts-awk

Repository files navigation

ts-awk

CI npm version npm downloads License: MIT Node.js Quality Gate Status Coverage Security Rating Maintainability Rating Reliability Rating

A TypeScript implementation of AWK, the classic text processing language. Usable as a CLI tool or as a library.

Installation

npm install -g ts-awk

Or as a project dependency:

npm install ts-awk

CLI 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 -F or FS
  • PatternsBEGIN, 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 flowif/else, while, for, do-while, break, continue, next, exit, ternary (?:)
  • Associative arraysarr[key], for (k in arr), delete, in
  • printf / sprintf%d, %f, %s, %c, %x, %o, %e, %g with width and precision
  • String functionslength, substr, index, split, sub, gsub, match, sprintf, tolower, toupper
  • Math functionsint, sqrt, sin, cos, atan2, exp, log, rand, srand
  • User-defined functionsfunction name(params) { body } with return and local variables
  • Output variablesOFS, ORS, RS
  • Built-in variablesNR, NF, FS, FILENAME, ARGC, ARGV, RSTART, RLENGTH
  • I/Oprint ... | "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 test

Scripts

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

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors