前者は の値が 0 かそうでないかで条件分岐すればいいだけですが、 この後者は、 とともに (多くは空文字列) を用意しておいて、パターンマッチのところを
if((pat[j]=="" || str ~ pat[j]) && (npat[j]=="" || str !~ npat[j]))のようにしています。 これは、 が空文字列なら通常と同じですが、そうでなければ
「str が にマッチして」かつ「str が にマッチしない」場合を意味します。 これによって、「 にはマッチするんだけど そのジャンルには入れたくないもの」を取り除くことができます。 取り除きは、取り除く方のジャンルを先に持ってきて、 そちらでそのような記事を先に釣り上げる、という手もあるのですが、 セクションの順番をそのような目的で入れかえるのは問題もありますし、 順番を入れかえられない事態もあり得ると思いますので、 そのために排除型のマッチングも用意しています。
他にも、ジャンル分けの精度を上げる方法や、 各ジャンルの記事数をより偏らないようにする方法、 一時的なジャンルの追加を認める方法など、 色々な拡張が考えられると思います。 AWK の利点を生かして、 色々な発展を考えてみたらいいのではないかと思います。