単語の削除

単語の削除 - みずぴー日記 にインスパイヤされて、同じようなものを awk で作ってみます。 ただし、元になっている anarchy golf - delete words とは異なりますので、注意してください。

元々の anarchy golf - delete words は文字列の縦横を見て、さらに逆順まで考慮する必要があるため面倒です。 境界を跨ぐ文字列の扱いが不明なのと、解くアルゴリズムにも依存しますが、AWK Users JP :: 転置行列を作る あたりを理解すれば、解くことができます。

今回は、文字列 words の個々の文字を空白に置換した文字列 strings を返す関数を作ります。 文字列を文字単位に分割するには split() 関数の第 3 引数に空文字列を指定すれば分割することができます。

#! /usr/local/bin/nawk -f
# delete_words.awk
# 指定された文字を空白にする
# usage: nawk -f delete_words.awk word strings

BEGIN {
    words   = ARGV[1];
    strings = ARGV[2];

    print "\"" delete_words(words, strings) "\"";
}

# delete_words(): 指定された文字を空白にする関数
#   in:     置換する文字列 words
#           置換される文字列 strings
#   out:    文字列 words の個々の文字を空白に置換した文字列 strings
function delete_words(words, strings,    chars, i) {
    split(words, chars, "");

    for (i in chars) {
        gsub(chars[i], " ", strings);
    }

    return strings;
}

出力結果が分かりにくいので、ここではダブルクォートで括って出力しています。

実行してみます。

$ gawk -f delete_words.awk golf flogwaiurhgm
"    waiurh m"

gsub() 関数で元の文字列を破壊して代入していますが、必要であれば変数に格納しておいてください。

tag_nawk.png tag_nawk.png tag_nawk.png tag_nawk.png