私はこれをGawkのマニュアルで読みました:
GNU拡張機能
[…]
FSの
値として、およびsplit()の3番目の引数としてnull文字列を使用して、個々の文字を分割する機能。
しかし、そうではないようです。これは期待どおりに機能します:
$ gawk 'BEGIN {print split("quebec", z, "")}'
6
他の拡張機能を無効にすることができます:
$ export POSIXLY_CORRECT
$ gawk 'BEGIN {typeof(1)}'
gawk: cmd. line:1: fatal: function `typeof' not defined
ただし、分割動作を無効にすることはできません:
$ export POSIXLY_CORRECT
$ gawk 'BEGIN {print split("quebec", z, "")}'
6
$ gawk --posix 'BEGIN {print split("quebec", z, "")}'
6
Mawkのマニュアルも調べました:
FS =“”の場合、mawkはレコードを個々の文字に分割し、
同様に、split(s、A、””)はsの個々の文字をAに配置します。[…]
Posixは、FS =“”の動作を明示的に未定義のままにし、
可能な解釈としてレコードを文字に分割することに言及していますが、
現在、この使用法は実装間で移植できません。
したがって、どの実装ではFS
で単一の文字を取得できないのですか? およびsplit
?
承認された回答:
これはPOSIXではありません。POSIXでは動作が指定されていないため、POSIXスクリプトで使用できません。 。つまり、アプリケーション(スクリプト)は移植性が必要な場合は使用できませんが、実装(awk
実装)あなたがそうし、それでもPOSIXであるならば、それが望むことは何でもすることができます。 POSIXはawk
を必要としません 文字やバイトに分割したり、エラーを報告したり、コンピュータを再起動したりするには、指定されていません。
つまり、gawk
$POSIXLY_CORRECT
の場合、その動作を変更する理由はありません。 が環境にある¹の場合、そのインスタンスで他の動作よりも正に正しい動作はありません。
ご存知のように、その拡張機能はgawk(3.0以降、1996年1月)およびmawk(バージョン1.2以降、1996年1月)にあります。また、busybox awk
にもあります (最初(2002年)から)、そして1996年5月以降、ブライアン・カーニハンによって維持されているもの(k
awk
で )(FIXES
ファイルはgawk
を参照します 、など。 インスピレーションとして)。数か月以内に3つすべてに追加されたようで、メンテナの間で話し合われた可能性があります。誰が最初にアイデアを思いついたのか、今はよくわかりません。
ブライアン・カーニハンのawk
または、FreeBSDやOpenBSDのようにそれに基づくものは、空のFS
または、split()
に渡された空の3番目の引数 文字列を個々の文字に分割します(バイト 、以下を参照)、awk -F ''
エラーを返します(awk -v FS=
でも大丈夫です。
Solarisでは、両方のnawk
および/usr/xpg4/bin/awk
(そして古い/bin/awk
70年代から)、空のFS
分割を完全に無効にしているようです。 nawk -F ''
エラーを返します。 AIXやHP/UXなどのAT&Tコードに基づく他の商用ユニスでも同じだと思いますが、そこでテストすることはできません。
mawk
にも注意してください 、bwkのawk
(これは、一部のベースでは異なります )およびbusyboxawkはマルチバイト文字をサポートしていません。たとえば、UTF-8では:
echo Stéphane | awk -v FS= '{print $4}'
私の名で3番目の文字の後半を印刷します。したがって、これらの場合、空のFSは文字ではなく、個々のバイトに分割されると言った方が正しいです。
¹POSIXLY_CORRECT、または--posix
を使用していることに気付きました。 、gawk
POSIX(typeof
)と競合しない一部の拡張機能を無効にします gawk
を作成します ただし、非準拠)なので、省略されていると言えます。今ではそれが最初ではないでしょう。たとえば、nextfile
は無効になりません POSIXと競合しますが(awk '{nextfile = 1}'
nextfile
に1を割り当てることを意味します 変数ですが、gawk
でエラーを報告します POSIXLY_CORRECTの下でも)