为什么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
cuonglm

首先,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数组的循环,并未指定的顺序产生了数组索引

用于(数组中的变量)

它将迭代,以未指定的顺序将数组的每个索引分配给变量

因此,由实现来定义如何遍历数组。

在我的系统中进行的快速测试表明,gawkmawk以递增顺序循环:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么awk中的split(string,regex)使用最后一个字段在第一个位置?

使用awk打印最后一个字段,然后使用$ NF打印第一个字段

awk + 如何计算第一个字段中的单词

将AWK中的第一个字段用作文件名

为什么选择*从仅返回第一个字段?

为什么 gRPC Python 看不到第一个字段?

为什么字符串数组中的第一个字母不转换为大写?

awk比较两个文件并在文件1中打印第一个字段

当字段分隔符也是 a 时,如何用 awk 替换第一个字段中的 a ,

使用awk获取最后一个字段

awk:将列标题转置到行的第一个字段

找到第二个字段的差异,使用第一个字段报告(awk)

如何使用awk在输出的第一个字段中添加字符串?

为什么我无法在Solr字段中搜索第一个单词或最后一个单词?

awk-打印数组的最后一个字段$ NF

为什么我需要添加双引号来打印java中char数组的第一个和最后一个元素

正则表达式匹配字符串的第一个和最后一个字符,但是为什么呢?

为什么解析第一个字符串数组中的数据时会引发异常,而跳过第一个数组时却不会引发异常?

在删除awk中的最后一个字段时,如何保留前导空格?

为什么在引用第二个字段时,该值取自第一个字段?

HTML 标签中的第一个字符串叫什么?

为什么在排序数组的第一个元素中得到一个随机数?

为什么JLabel是第一个字符时不显示“ /”?

为什么对象的键只是第一个字符?

为什么匹配功能只返回第一个字母?

如果EOF是第一个字符,为什么会被识别?

为什么printf只显示第一个字母?

iostream为什么要截断某些单词的第一个字母?

为什么该程序只打印第一个字符?