+ -
当前位置:首页 → 问答吧 → 高手们帮我看看这个对不对阿?总是犯迷糊..

高手们帮我看看这个对不对阿?总是犯迷糊..

时间:2011-05-03

来源:互联网

本帖最后由 南极雨 于 2011-05-03 20:39 编辑

讨论的是:awk 数组中的各个值的问题,如数组的值,数组下标index的值,数组元素的值,迷迷糊糊的

awk 数组中所定义的数组以哪一格域为下标,则数组则代表这一域
如name[$2] 则将$2 这一列组合成一数组,如果赋值,则代表所赋值组合成的数组,例如: name[$2]=$1
则name是由$1这一列组成的数组,如果,name[$2]=1,则根据NR的值组成NR个由1组成的数组,每个元素用name[NR]表示,每个name[NR]=1,看下面的例子:
  1. [root@localhost awk]# cat file
  2. 1214 42  5 34  543 54
  3. 2323 434 43 34 434 44
  4. 122  32
  5. 1213 324 4345 456 56 77
  6. 1233 q3 we23 <F2>2342 2342
  7. 213 213 546 798 987 654

  8. [root@localhost awk]# awk  '{name[$0]=$1};END{for(i in name) print  name[i]}' file
  9. 122
  10. 2323
  11. 1233
  12. 1213
  13. 213
  14. 1214
  15. [root@localhost awk]# awk  '{name[$0]=1};END{for(i in name) print  name[i]}' file
  16. 1
  17. 1
  18. 1
  19. 1
  20. 1
  21. 1
复制代码
name这个数组名则无法直接打印:
  1. [root@localhost awk]# awk  '{name[$2]=1};END{for(i in name) print  name}' file
  2. awk: (FILENAME=file FNR=6) fatal: attempt to use array `name' in a scalar context
复制代码
然而,for(i in name) i则表示的是name[$x]中的x这一列,因为x在此是下标,就是$x,如:
  1. [root@localhost awk]# awk  '{name[$2]=1};END{for(i in name) print  i}' file     
  2. 324
  3. q3
  4. 32
  5. 42
  6. 213
  7. 434
复制代码
END 语句中,name数组仍然表示的是$2,并不改变,而name 的值会是1,i的值为$2的值,则i为name的下标,name["42"]=42 name["434"]=434....

作者: 南极雨   发布时间: 2011-05-03

name["42"]=42是想表达什么意思?

作者: Shell_HAT   发布时间: 2011-05-03

for  (i in name)
表示变量i遍历数组name下标

如后面跟print i,则把数组所有下标打印一遍
如后面跟print a[ i ],则把数组所有下标对应的数组值打一遍

作者: ywlscpl   发布时间: 2011-05-03

看不懂

作者: ziyunfei   发布时间: 2011-05-03

回复 南极雨


    如果建立了name数组的话,是不能直接print name的,因为awk不允许再将name作为一个变量名(print name时,awk认为是打印变量name的值),所以会报错。

作者: yinyuemi   发布时间: 2011-05-03