awk Split()が最初のフィールドを配列の最後の要素にするのはなぜですか?

awk Split()が最初のフィールドを配列の最後の要素にするのはなぜですか?

おそらくここで非常に簡単なものを見逃しているかもしれませんが、

echo 'The quick brown fox jumped over the lazy dog.' | \
    awk '{
        split($0, WORDS, " ");
        for ( WORD in WORDS ) {
            print $WORD;
        }
    }'

私はその代償としてこれを得ます:

quick
brown
fox
jumped
over
the
lazy
dog.
The

最初の単語が最後に印刷されるのはなぜですか?

$ awk --version
awk version 20070501

ベストアンサー1

まず、Yieldfor (i in array)にあるのはawk配列要素ではなく配列のインデックスです。だからあなたは訪問したのと同じ結果を得ます$1。 ....$2$NF

echo 'The quick brown fox jumped over the lazy dog.' | \
    awk '{
        split($0, WORDS, " ");
        for ( WORD in WORDS ) {
            print WORD;       
        }
    }'
2
3
4
5
6
7
8
9
1

変数にアクセスすると、配列インデックスを取得するのがわかりますWORD


あなたの質問に対して、POSIXはawk配列ループを介して配列インデックスの生成を定義します。指定された注文はありません。:

for(配列の変数)

繰り返して、配列の各インデックスを変数に割り当てます。 指定された注文はありません。

したがって、定義は実装に依存します。どのように配列を繰り返します。

私のシステムのクイックテストは、次のように増加する順序gawkで繰り返されることを示していますmawk

for AWK in gawk mawk /usr/5bin/[on]awk /usr/5bin/posix/awk; do
  printf '==%s==\n' "$AWK"
  echo 'The quick brown fox jumped over the lazy dog.' |
  "$AWK" '{
    split($0, WORDS, " ")
    for (WORD in WORDS) {
      print WORD;
    }
  }' | { sed 1q; tail -n1 }
 done
==awk==
1
9
==mawk==
1
9
==/usr/5bin/nawk==
2
1
==/usr/5bin/oawk==
2
1
==/usr/5bin/posix/awk==
2
1

(GNUを使用するsedsed -u 1q

おすすめ記事