中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 利用FOR提取FIND要查找字符,然后记数的问题
作者:
标题: 利用FOR提取FIND要查找字符,然后记数的问题 上一主题 | 下一主题
THENEWLIFE
初级用户




积分 78
发帖 64
注册 2008-8-29
状态 离线
『楼 主』:  利用FOR提取FIND要查找字符,然后记数的问题

我一个TXT文本有如下内容:
05.05.31:  108896  908045(X)  918178  918089(X)  plp
05.06.13:  108933  108768
05.06.29:  108949  108926
05.08.11:  918131(X)
05.10.13:  108722
05.10.17:  108912
05.11.04: 108016
05.11.10: 858001  858002  928050  928068
05.11.25: 828166
05.11.30: 928098  928168
05.12.02: 108590  108668  108527
05.12.27: 928186
我想知道里面有多少个"928"开的的数组,例如"928098"
我的命令是这样的
for /f %%i in ('find  " 928*" 1.txt ') do (set t+=1)
pause  :::


我直接用 find " 928" 能在 1.txt中找到这样的结果:
---------- 1.TXT
05.11.10: 858001  858002  928050  928068
05.11.30: 928098  928168
05.12.27: 928186
按4楼的讲解,我对find的理解是:find 是一行一行的找过去,只要有他需要找的东西,他就会显示一行的内容。但为什么我用“ 928*”却什么也找不到呢?
还有就是for /f "tokens=*"是取所有符号传递给FOR程序体吗,我直接不把 "tokens=*"打出来 ,他默认也是取所有的吧,像 for /f %%i in
                                                                      for /f "tokens=*" %%i in
                                                                      2个的意思是一样的吗?
tokens=1* 这个是取每行的第一个字符吗,那为什么后面要打*呢
    我看FOR 的注释,他是tokens=2,3*这样用,
我对这句话的理解是取每行第一个字符给FOR程序本体,有”*“的话就可以扩展去第二个,和第三个一直到范围边缘。如果1后面没跟”*“的话。就只取一个,不能扩展是吗?

[ Last edited by THENEWLIFE on 2009-6-4 at 00:08 ]

2009-6-2 10:08
查看资料  发短消息 网志   编辑帖子  回复  引用回复
moniuming
银牌会员

永远的菜鸟



积分 1335
发帖 574
注册 2007-11-27
来自 广西
状态 离线
『第 2 楼』:  


@echo off
Setlocal Enabledelayedexpansion
set "file=temp_\a.txt"%请在这指定文件%
set n=0
for /f "delims=" %%a in ('type "%file%"') do (
   set "str=%%a"
   for %%i in (!str!) do (
      set "var=%%i"
      if "!var:~,3!"=="928" set /a n+=1
   )
)
echo.&echo.一共有"%n%"个以"928"开头的数组...&echo.&pause


2009-6-2 11:13
查看资料  发短消息 网志   编辑帖子  回复  引用回复
THENEWLIFE
初级用户




积分 78
发帖 64
注册 2008-8-29
状态 离线
『第 3 楼』:  

你好,谢谢你的回复
为什么我的不行呢,我的想法是这样的,先用FIND 找出要找的数字.然后再计数.不知道我的错在哪呢,我直接用'find  " 928*" 1.txt  好象也不能用, 这句是我以前发贴一个大大教我用的.因为我要找928开头的数字,为了避免这样的"918928"
还请前辈门帮忙解释下

2009-6-2 11:19
查看资料  发短消息 网志   编辑帖子  回复  引用回复
moniuming
银牌会员

永远的菜鸟



积分 1335
发帖 574
注册 2007-11-27
来自 广西
状态 离线
『第 4 楼』:  

find是一行一行的查找,做不到一列一列的查找,所以要用字符截取才能实现.

2009-6-2 11:29
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 5 楼』:  


@echo off
setlocal enabledelayedexpansion
for /f "tokens=*" %%a in (1.txt) do (
  set var=%%a
  for %%a in ("!var: 928=" "!") do set /a n+=1
  set /a n-=1
)
echo %n%
pause


2009-6-2 12:14
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 6 楼』:  



@echo off&setlocal enabledelayedexpansion
for /f "tokens=1* delims=::" %%a in (a.txt) do (
   for %%i in (%%b) do (
      set var=%%i
      if "!var:~0,3!"=="928" set /a n+=1
    )
)
echo,一共有 %n% 个以 928 开头的数组...&echo,
pause


@echo off
set "var=\"一共有\",n,\"个以 928 开头的数组..\""
gawk "{for(i=1;i<=NF;i++)if($i~/^928/){n++;print $i}};END{print %var%}" a.txt
pause
.

[ Last edited by 26933062 on 2009-6-2 at 16:02 ]



致精致简!
2009-6-2 15:30
查看资料  发短消息 网志   编辑帖子  回复  引用回复
THENEWLIFE
初级用户




积分 78
发帖 64
注册 2008-8-29
状态 离线
『第 7 楼』:  

我直接用 find " 928" 能在 1.txt中找到这样的结果:
---------- 1.TXT
05.11.10: 858001  858002  928050  928068
05.11.30: 928098  928168
05.12.27: 928186
按4楼的讲解,我对find的理解是:find 是一行一行的找过去,只要有他需要找的东西,他就会显示一行的内容。但为什么我用“ 928*”却什么也找不到呢?
还有就是for /f "tokens=*"是取所有符号传递给FOR程序体吗,我直接不把 "tokens=*"打出来 ,他默认也是取所有的吧,像 for /f %%i in
                                                                      for /f "tokens=*" %%i in
                                                                      2个的意思是一样的吗?
tokens=1* 这个是取每行的第一个字符吗,那为什么后面要打*呢
    我看FOR 的注释,他是tokens=2,3*这样用,
我对这句话的理解是取每行第一个字符给FOR程序本体,有”*“的话就可以扩展去第二个,和第三个一直到范围边缘。如果1后面没跟”*“的话。就只取一个,不能扩展是吗?

2009-6-2 22:19
查看资料  发短消息 网志   编辑帖子  回复  引用回复
THENEWLIFE
初级用户




积分 78
发帖 64
注册 2008-8-29
状态 离线
『第 8 楼』:  

还请前辈门帮忙解释下疑问
——————————————————————————————————————
请不要发同意的帖子
因为你发了个同样的帖子,所以我已经将下面你发的同样的帖子删除了
操作:不得不爱
——————————————————————————————————————


[ Last edited by 不得不爱 on 2009-6-4 at 23:28 ]

2009-6-3 11:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 9 楼』:  

用下面的命令可以办到
for /f %a in ('find " 928" ^<1.txt') do set/a b+=1
1楼的for /f %%i in ('find  " 928*" 1.txt ') do (set t+=1)会让find搜索 928*并且在搜索到后显示文件名,所以会得不到正确的答案,因为文档里根本没有
包含 928*字符串!
楼上几位是不是把问题搞复杂了,利用find命令就1句就可以了

[ Last edited by 不得不爱 on 2009-6-4 at 23:34 ]



我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2009-6-4 23:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by 不得不爱 at 2009-6-4 11:23 PM:
用下面的命令可以办到
for /f %a in ('find " 928" ^<1.txt') do set/a b+=1
1楼的for /f %%i in ('find  " 928*" 1.txt ') do (set t+=1)会让find搜索 9 ...

每行的 928 的数量不定。如果每行最多只有一个 928 就可以这样。

[ Last edited by tireless on 2009-6-5 at 00:56 ]

2009-6-5 00:25
查看资料  发短消息 网志   编辑帖子  回复  引用回复
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 11 楼』:  

那还是用这个吧!通过2次搜索928来提高效率!
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%a in ('find "928" ^<1.txt') do for %%b in (%%a) do (
set c=%%b
if "!c:~,3!"=="928" set/a t+=1)
echo 一共有"%t%"个以"928"开头的数组
pause




我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2009-6-5 21:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
THENEWLIFE
初级用户




积分 78
发帖 64
注册 2008-8-29
状态 离线
『第 12 楼』:  

谢谢,不得不爱版主的帮助
还请帮忙解释下7楼的疑问

2009-6-8 23:08
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 13 楼』:  

find " 928*" 1.txt 找的是引号内的字符本身,*find 命令中不是通配符。

===========================================

tokens=* 是取剩余部分。

例如有字符串:

   前面有 3 个空格

"tokens=1,*" → 第一块为“前面有”,第二块为“3 个空格”
"tokens=*" → 结果为“前面有 3 个空格”
"delims=" → 结果为“   前面有 3 个空格”

2009-6-9 03:03
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: