循环中<=与<结果不一样

sh/bash/dash/ksh/zsh等Shell脚本
回复
ps3wifi
帖子: 87
注册时间: 2010-01-08 13:09
送出感谢: 2 次
接收感谢: 0

循环中<=与<结果不一样

#1

帖子 ps3wifi » 2020-04-04 19:11

[email protected]:~# cat a8.txt
1 2 3 4 5 6 7 8 9 10 1 1
[email protected]:~# awk '{i=1;while(i<NF){if($i~/1/){x++} else{y++};i++}} END{print x,y}' a8.txt
3 8
[email protected]:~# 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
论坛管理员
帖子: 10357
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04
送出感谢: 7 次
接收感谢: 114 次

Re: 循环中<=与<结果不一样

#2

帖子 oneleaf » 2020-04-04 21:33

代码: 全选

 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}' 
i应该从0开始计数。
ps3wifi
帖子: 87
注册时间: 2010-01-08 13:09
送出感谢: 2 次
接收感谢: 0

Re: 循环中<=与<结果不一样

#3

帖子 ps3wifi » 2020-04-05 13:24

oneleaf 写了:
2020-04-04 21:33

代码: 全选

 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}' 
i应该从0开始计数。
谢谢你,刚刚才看到python关于循环这章节确实for是从1开始计数循环,while是从0开始
ps3wifi
帖子: 87
注册时间: 2010-01-08 13:09
送出感谢: 2 次
接收感谢: 0

Re: 循环中<=与<结果不一样

#4

帖子 ps3wifi » 2020-04-05 22:32

oneleaf 写了:
2020-04-04 21:33

代码: 全选

 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}' 
i应该从0开始计数。
但为什么条件是小于等于<=的时候会多计算一次?
头像
astolia
论坛版主
帖子: 4601
注册时间: 2008-09-18 13:11
送出感谢: 1 次
接收感谢: 771 次

Re: 循环中<=与<结果不一样

#5

帖子 astolia » 2020-04-06 12:21

ps3wifi 写了:
2020-04-05 13:24
谢谢你,刚刚才看到python关于循环这章节确实for是从1开始计数循环,while是从0开始
没这回事。都是按你的需要。喜欢的话,从2开始也没问题

代码: 全选

for i in range(2, 5):
  print(i)
ps3wifi 写了:
2020-04-05 22:32
但为什么条件是小于等于<=的时候会多计算一次?
你会问这个问题说明你没完全理解while的运作机制

代码: 全选

while(条件) 语句
语法是上面这样的。只要条件满足时,执行后面的语句

代码: 全选

echo "1 2 3" | awk  '{i=1;while(i<=NF){print i;i++}}'
那么在这段awk程序中,执行流程如下

代码: 全选

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,不满足条件,退出循环
结束程序
如果换成<,那么到了3<3就不满足条件了,在那里就会退出
ps3wifi
帖子: 87
注册时间: 2010-01-08 13:09
送出感谢: 2 次
接收感谢: 0

Re: 循环中<=与<结果不一样

#6

帖子 ps3wifi » 2020-04-27 23:01

astolia 写了:
2020-04-06 12:21
ps3wifi 写了:
2020-04-05 13:24
谢谢你,刚刚才看到python关于循环这章节确实for是从1开始计数循环,while是从0开始
没这回事。都是按你的需要。喜欢的话,从2开始也没问题

代码: 全选

for i in range(2, 5):
  print(i)
ps3wifi 写了:
2020-04-05 22:32
但为什么条件是小于等于<=的时候会多计算一次?
你会问这个问题说明你没完全理解while的运作机制

代码: 全选

while(条件) 语句
语法是上面这样的。只要条件满足时,执行后面的语句

代码: 全选

echo "1 2 3" | awk  '{i=1;while(i<=NF){print i;i++}}'
那么在这段awk程序中,执行流程如下

代码: 全选

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,不满足条件,退出循环
结束程序
如果换成<,那么到了3<3就不满足条件了,在那里就会退出
谢谢版主经你的解答搞明白了while循环,但是后面if($i~/1/){x++} else{y++};i++}} END{print x,y}'这里如果循环包含数字1 x变量就加1次,while循环的话那每次都有数字1,x的变量值也不对呀?难道x的变量是不经过循环处理,直接在整个数字加出来的
头像
astolia
论坛版主
帖子: 4601
注册时间: 2008-09-18 13:11
送出感谢: 1 次
接收感谢: 771 次

Re: 循环中<=与<结果不一样

#7

帖子 astolia » 2020-04-28 10:32

ps3wifi 写了:
2020-04-27 23:01
但是后面if($i~/1/){x++} else{y++};i++}} END{print x,y}'这里如果循环包含数字1 x变量就加1次
不是循环包含数字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}'
ps3wifi
帖子: 87
注册时间: 2010-01-08 13:09
送出感谢: 2 次
接收感谢: 0

Re: 循环中<=与<结果不一样

#8

帖子 ps3wifi » 2020-04-28 15:23

谢谢版主这下明白啦,awk还能这样输出每一次变量值,又学到了
ps3wifi
帖子: 87
注册时间: 2010-01-08 13:09
送出感谢: 2 次
接收感谢: 0

Re: 循环中<=与<结果不一样

#9

帖子 ps3wifi » 2020-04-28 18:39

astolia 写了:
2020-04-28 10:32
ps3wifi 写了:
2020-04-27 23:01
但是后面if($i~/1/){x++} else{y++};i++}} END{print x,y}'这里如果循环包含数字1 x变量就加1次
不是循环包含数字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}'
版主还是有一个疑问,当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
论坛版主
帖子: 4601
注册时间: 2008-09-18 13:11
送出感谢: 1 次
接收感谢: 771 次

Re: 循环中<=与<结果不一样

#10

帖子 astolia » 2020-04-29 0:00

ps3wifi 写了:
2020-04-28 18:39
版主还是有一个疑问,当i条件为0时,$i变量输出是1 2 3 4 5 6 7 8 9 10 1 1,如果i条件为1时,$i变量输出就会从1开始逐个输出,0和1都是条件小于NF,然后while进入循环,为什么$i的值会不一样
上次我给你推荐的书 https://forum.ubuntu.com.cn/viewtopic.p ... 7#p3220107 里面的1.2章就有说明,你是没去看还是看了没记?
ps3wifi
帖子: 87
注册时间: 2010-01-08 13:09
送出感谢: 2 次
接收感谢: 0

Re: 循环中<=与<结果不一样

#11

帖子 ps3wifi » 2020-05-01 9:02

astolia 写了:
2020-04-29 0:00
ps3wifi 写了:
2020-04-28 18:39
版主还是有一个疑问,当i条件为0时,$i变量输出是1 2 3 4 5 6 7 8 9 10 1 1,如果i条件为1时,$i变量输出就会从1开始逐个输出,0和1都是条件小于NF,然后while进入循环,为什么$i的值会不一样
上次我给你推荐的书 https://forum.ubuntu.com.cn/viewtopic.p ... 7#p3220107 里面的1.2章就有说明,你是没去看还是看了没记?
版主我看了那个章节,是不是当i=0时,$i相当于$0,所以会输入全文
回复

回到 “Shell脚本”