0 ならば 1、1 ならば 0 を返す簡単なお仕事

様々なとことで「0 ならば 1、1 ならば 0 を返す」ものが話題になっています。

そこで、awk で同様のことをやってみます。

完結に記述しようとすれば、以下の 3 種類の方法が思いつきます。

$ echo '0' | nawk '{print $0 ? 0 : 1}'
1

$ echo '1' | nawk '{print $0 ? 0 : 1}'
0

とか

$ echo '0' | nawk '{print $0 = $0 == 0}'
1

$ echo '1' | nawk '{print $0 = $0 == 0}'
0

とか

$ echo '1' | nawk '{print $0 = !$0}'
0

$ echo '0' | nawk '{print $0 = !$0}'
1

といったものです。

最初のものは比較演算子 (三項演算子) で $0 が真であるかどうかを判断しています。 次のものは代入演算子よりも比較演算子の方が順位が高いことを利用したものです。 最後のものは $0 を否定することで、真の場合には偽を返し、偽の場合には真を返すようにしています。

この最後のものを用いて関数化しておきます。

#! /usr/local/bin/nawk -f
# true_or_false.awk
# 0 ならば 1、1 ならば 0 を返す
# usage: nawk -f true_or_false.awk

BEGIN {
    print true_or_false(x);
    print true_or_false(true_or_false(x));
    print true_or_false("true");
}

# true_or_false():  0 ならば 1、1 ならば 0 を返す
#   in:     数値 num (実際には文字列でも構わない)
#   out:    数値 num が真なら 0、偽なら 1
function true_or_false(num) {
    return num = !num;
}

awk では変数宣言がない場合には、空の文字列または 0 が代入されます。 3 つめの print 文の true_or_false() 関数には文字列が含まれていますが、awk では 0 以外は全て真になります。 では実行してみます。

$ nawk -f true_or_false.awk
1
0
0

予想通りの答えが戻ってきましたか?

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