おそらくここで非常に簡単なものを見逃しているかもしれませんが、
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を使用するsed
とsed -u 1q
)