From 110486b7d7c624bfd545b66a130a18325f1e149d Mon Sep 17 00:00:00 2001 From: Abigail Date: Wed, 10 Feb 2021 17:33:35 +0100 Subject: AWK solution for week 99, part 2 --- challenge-099/abigail/README.md | 1 + challenge-099/abigail/awk/ch-2.awk | 53 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 challenge-099/abigail/awk/ch-2.awk diff --git a/challenge-099/abigail/README.md b/challenge-099/abigail/README.md index 26e7b6cac7..c881afbbd7 100644 --- a/challenge-099/abigail/README.md +++ b/challenge-099/abigail/README.md @@ -79,6 +79,7 @@ Output: 3 assume the string and pattern are separated by a space. ### Solutions +* [AWK](awk/ch-2.awk) * Perl * [Using regular expressions](perl/ch-2.pl) * [Recursive counting](perl/ch-2a.pl) diff --git a/challenge-099/abigail/awk/ch-2.awk b/challenge-099/abigail/awk/ch-2.awk new file mode 100644 index 0000000000..d88806279e --- /dev/null +++ b/challenge-099/abigail/awk/ch-2.awk @@ -0,0 +1,53 @@ +#!/usr/bin/awk + +# +# See ../README.md +# + +# +# Run as: awk -f ch-2.awk < input-file +# + +# +# Read input from standard input, assuming one exercise per line. +# Each line consists of a string $S, and a pattern $T, separated +# by whitespace. +# + +# +# Recursively count matches: +# - If either the string or the pattern is empty, there are no matches. +# - Else, + count the matches if we don't match at the first character +# if the string. +# + if the first character of the string equals the first +# character of the pattern: +# o add 1 if the pattern is just one character long +# o else, add the number of matches starting from the +# then next character in the string, and the next +# character in the pattern. +# + +# +# Note that we do not have lexical variables in AWK, so we're +# using a global count variable. +# +function matches (string, pattern) { + if (length (string) == 0 || length (pattern) == 0) { + return 0 + } + matches(substr (string, 2), pattern) + if (substr (string, 1, 1) == substr (pattern, 1, 1)) { + if (length (pattern) == 1) { + count ++ + } + else { + matches(substr (string, 2), substr (pattern, 2)) + } + } +} + +{ + count = 0 + matches($1, $2) + print count +} -- cgit