循环中<=与<结果不一样
-
- 帖子: 94
- 注册时间: 2010-01-08 13:09
循环中<=与<结果不一样
root@gxqswj:~# cat a8.txt
1 2 3 4 5 6 7 8 9 10 1 1
root@gxqswj:~# awk '{i=1;while(i<NF){if($i~/1/){x++} else{y++};i++}} END{print x,y}' a8.txt
3 8
root@gxqswj:~# awk '{i=1;while(i<=NF){if($i~/1/){x++} else{y++};i++}} END{print x,y}' a8.txt
4 8
想请教一下大家,条件i小于NF(整个字段域是12),字段中匹配到1,x变量加1否则y变量就加1,1出现3次统计出来是3对的,后面是没有匹配到1时就统计出来的数8,怎么不是9???
条件i小于等于NF,匹配的次数是4???,我自己的理解是因为i小于NF(就是整个字段域是12)所有当循环到第11个字段域就停止循环了,i小于等于NF的时候就是到12的时候才停止循环,不知道这样理解对不对???但第2个命令最后也还是8没变,求大家帮忙解答谢谢啦!!!
1 2 3 4 5 6 7 8 9 10 1 1
root@gxqswj:~# awk '{i=1;while(i<NF){if($i~/1/){x++} else{y++};i++}} END{print x,y}' a8.txt
3 8
root@gxqswj:~# awk '{i=1;while(i<=NF){if($i~/1/){x++} else{y++};i++}} END{print x,y}' a8.txt
4 8
想请教一下大家,条件i小于NF(整个字段域是12),字段中匹配到1,x变量加1否则y变量就加1,1出现3次统计出来是3对的,后面是没有匹配到1时就统计出来的数8,怎么不是9???
条件i小于等于NF,匹配的次数是4???,我自己的理解是因为i小于NF(就是整个字段域是12)所有当循环到第11个字段域就停止循环了,i小于等于NF的时候就是到12的时候才停止循环,不知道这样理解对不对???但第2个命令最后也还是8没变,求大家帮忙解答谢谢啦!!!
- oneleaf
- 论坛管理员
- 帖子: 10441
- 注册时间: 2005-03-27 0:06
- 系统: Ubuntu 12.04
Re: 循环中<=与<结果不一样
代码: 全选
echo "1 2 3 4 5 6 7 8 9 10 1 1"|awk '{i=0;while(i<NF){if($i~/1/){x++} else{y++};i++}} END{print x,y}'
-
- 帖子: 94
- 注册时间: 2010-01-08 13:09
-
- 帖子: 94
- 注册时间: 2010-01-08 13:09
- astolia
- 论坛版主
- 帖子: 6454
- 注册时间: 2008-09-18 13:11
Re: 循环中<=与<结果不一样
没这回事。都是按你的需要。喜欢的话,从2开始也没问题
代码: 全选
for i in range(2, 5):
print(i)
你会问这个问题说明你没完全理解while的运作机制
代码: 全选
while(条件) 语句
代码: 全选
echo "1 2 3" | awk '{i=1;while(i<=NF){print i;i++}}'
代码: 全选
i=1
判断1<=3,满足条件
print 1
i++,即将i置为2
判断2<=3,满足条件
print 2
i++,即将i置为3
判断3<=3,满足条件
print 3
i++,即将i置为4
判断4<=3,不满足条件,退出循环
结束程序
-
- 帖子: 94
- 注册时间: 2010-01-08 13:09
Re: 循环中<=与<结果不一样
谢谢版主经你的解答搞明白了while循环,但是后面if($i~/1/){x++} else{y++};i++}} END{print x,y}'这里如果循环包含数字1 x变量就加1次,while循环的话那每次都有数字1,x的变量值也不对呀?难道x的变量是不经过循环处理,直接在整个数字加出来的astolia 写了: ↑2020-04-06 12:21没这回事。都是按你的需要。喜欢的话,从2开始也没问题代码: 全选
for i in range(2, 5): print(i)
你会问这个问题说明你没完全理解while的运作机制语法是上面这样的。只要条件满足时,执行后面的语句代码: 全选
while(条件) 语句
那么在这段awk程序中,执行流程如下代码: 全选
echo "1 2 3" | awk '{i=1;while(i<=NF){print i;i++}}'
如果换成<,那么到了3<3就不满足条件了,在那里就会退出代码: 全选
i=1 判断1<=3,满足条件 print 1 i++,即将i置为2 判断2<=3,满足条件 print 2 i++,即将i置为3 判断3<=3,满足条件 print 3 i++,即将i置为4 判断4<=3,不满足条件,退出循环 结束程序
- astolia
- 论坛版主
- 帖子: 6454
- 注册时间: 2008-09-18 13:11
Re: 循环中<=与<结果不一样
不是循环包含数字1,而是变量i中包含字符1。
要知道为什么,一个很简单的做法是,输出每一步中各个变量的值,就一目了然了
代码: 全选
echo "1 2 3 4 5 6 7 8 9 10 1 1"|awk '{i=0;while(i<NF){if($i~/1/){x++} else{y++};print "i=",i;print "NF=",NF;print "$i=",$i;print "$i~/1/=",$i~/1/;print "x,y=",x,y;i++}} END{print x,y}'
-
- 帖子: 94
- 注册时间: 2010-01-08 13:09
Re: 循环中<=与<结果不一样
谢谢版主这下明白啦,awk还能这样输出每一次变量值,又学到了
-
- 帖子: 94
- 注册时间: 2010-01-08 13:09
Re: 循环中<=与<结果不一样
版主还是有一个疑问,当i条件为0时,$i变量输出是1 2 3 4 5 6 7 8 9 10 1 1,如果i条件为1时,$i变量输出就会从1开始逐个输出,0和1都是条件小于NF,然后while进入循环,为什么$i的值会不一样
- astolia
- 论坛版主
- 帖子: 6454
- 注册时间: 2008-09-18 13:11
Re: 循环中<=与<结果不一样
上次我给你推荐的书 https://forum.ubuntu.com.cn/viewtopic.p ... 7#p3220107 里面的1.2章就有说明,你是没去看还是看了没记?
-
- 帖子: 94
- 注册时间: 2010-01-08 13:09
Re: 循环中<=与<结果不一样
版主我看了那个章节,是不是当i=0时,$i相当于$0,所以会输入全文astolia 写了: ↑2020-04-29 0:00上次我给你推荐的书 https://forum.ubuntu.com.cn/viewtopic.p ... 7#p3220107 里面的1.2章就有说明,你是没去看还是看了没记?