GNU/Linux >> Linux の 問題 >  >> Linux

ヌル文字列を使用して個々の文字を分割しますか?

私はこれを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= でも大丈夫です。

関連:遺伝子型を0/1に変換しますか?

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の下でも)


Linux
  1. 辞書を使用した文字列の置換?

  2. Duコマンドで–excludeを使用しますか?

  3. コマンドの出力をBashを使用して列ごとに分割しますか?

  1. 名前に特殊文字を含むファイルでの find および tar の使用

  2. / パーティションのすべてのスペースを使い果たしているものを見つけるにはどうすればよいですか?

  3. インターネットへの接続に使用しているインターフェイスを確認するにはどうすればよいですか?

  1. Linuxでprocファイルシステムを使用してトラブルシューティングする

  2. Wcで各行の文字を数えますか?

  3. 文字列の最後の3文字だけを印刷するコマンド?