我可能在这里错过了一些非常简单的事情,但是当我说
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
首先,for (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
您可以看到在访问variable时获得了数组索引WORD
。
对于您的问题,POSIX定义了遍历awk
数组的循环,并以未指定的顺序产生了数组索引:
用于(数组中的变量)
它将迭代,以未指定的顺序将数组的每个索引分配给变量。
因此,由实现来定义如何遍历数组。
在我的系统中进行的快速测试表明,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
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句