标题: [文本处理] 应该如何写这个批处理统计一个文本中的数字出现次数 [打印本页]
作者: ketop 时间: 2012-9-20 09:58 标题: 应该如何写这个批处理统计一个文本中的数字出现次数
写个批处理,统计一个文本中的数字出现次数,按从少到多顺序排列。
如文本1.txt里的内容为:
5 2 5 4 6 1 2 5 0 8 7 9 5 4 6 2 0 8 9 7 6 0 4 2 5 1 。。。。。。。。。
内容比较多,要求统计在0后面出现数字从少到多次序排列出来
如:
0后面出现的数字:1为0次,2为0次,3为0次,5为0次,6为0次,7为0次,9为0次,4为1次,8为2次。。。。。。。。。;
1后面出现的数字:。。。。。。。。。。。。。。。。。
我刚接触,很多都看不懂,不过我知道有段代码可以借鉴:
@echo off
setlocal enabledelayedexpansion
:i
for /f "delims=: tokens=1" %%i in ('findstr /n "." 1.txt') do (
set end=%%i
)
set /a end-=6
set a=1
for /f "tokens=*" %%i in ('more +%end% 1.txt') do (
set a!a!=%%i
set /a a+=1
)
set str=
set ok=
for /l %%i in (0,1,9) do (
call :set %%i
set n%%i=!back!
if !back!==0 set "str=%%i !str!"
)
md tmp
cd tmp
for /l %%i in (0,1,9) do if not !n%%i!==0 (
for /l %%a in (1,1,!n%%i!) do (echo.a>>%%i)
)
set /p=出现频率:<nul
for /f "tokens=*" %%i in ('dir /b /o:-s') do (
set /p=%%i-!n%%i!次 <nul
)
cd..
rd /s /q tmp>nul
echo.
echo.没出现过的数字有:%str%
echo.按任意键重新运行一次。
pause>nul
goto :i
:set
set back=-6
for /l %%i in (1,1,6) do (
set "b%%i=!a%%i:%1=t,t!"
for %%a in (!b%%i!) do set /a back+=1
)
goto :eof
高手帮我分析一下吧,谢谢~!
作者: apang 时间: 2012-9-20 10:38
0后面出现的数字:1为0次,2为0次,3为0次,5为0次,6为0次,7为0次,9为0次,4为1次,8为2次。。。
这个是依据什么计算出来的?
作者: ketop 时间: 2012-9-20 11:11
就是这堆数字中,5 2 5 4 6 1 2 5 0 8 7 9 5 4 6 2 0 8 9 7 6 0 4 2 5 1 。。。。。。。。。
紧挨着0后面出现的数字
紧挨着0后面没有1出现过,所以1是0次,8在0后面出现过2次,4出现过1次
要处理的文本比较大,大概几百k到1m那样吧,不知道能处理吗?
作者: lky216 时间: 2012-9-20 12:06
多大也能处理,那就是要看时间多久了。期待大婶回复。
作者: 冷玉公子 时间: 2012-9-20 15:41
哈哈 个人觉得这个方法很靠谱- @Echo Off&SetLocal EnableDelayedExpansion
- For %%A In (1 2 3 4 5 6 7 8 9) Do Set _%%A=0
- For %%A In (5 2 5 4 6 1 2 5 0 8 7 9 5 4 6 2 0 8 9 7 6 0 4 2 5 1 0 4 2 5 1 0 5 2 5 1) Do (
- If "!Is!" == "1" Set /A "_%%A+=1" & Set "Is="
- If %%A Equ 0 Set "Is=1"
- )
- Set /P Echo=0后面出现的数字:< Nul
- For /F "tokens=1,2 delims=_=" %%A In ('Set _') Do (
- Set /P Echo=%%A为%%B次,< Nul
- )
- Pause>Nul
复制代码
上面的命令执行结果为:- 0后面出现的数字:1为0次,2为0次,3为0次,4为2次,5为1次,6为0次,7为0次,8为2次,9为0次,
复制代码
作者: ketop 时间: 2012-9-20 17:47
回复 5# 冷玉公子
你好,谢谢你的回复,不过我要处理的不仅仅是那一点数据,而且一个1.txt文本,里面的内容比那一行数字大多了,For %%A In (5 2 5 4 6 1 2 5 0 8 7 9 5 4 6 2 0 8 9 7 6 0 4 2 5 1 0 4 2 5 1 0 5 2 5 1) Do (
这一行应该改一下吧,期待你的回复~!!
作者: apang 时间: 2012-9-20 23:44
效率不高、没有排序。。。- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (a.txt) do (
- set "str=$%%a$"
- for /l %%b in (0 1 9) do (
- for /l %%c in (0 1 9) do (
- for %%d in ("!str:%%b %%c=" "!") do set/a .%%b%%c+=1
- set/a .%%b%%c-=1
- )
- )
- )
- (for /l %%a in (0 1 9) do (
- for /l %%b in (0 1 9) do set "v=!v!,%%b为!.%%a%%b!次"
- echo,%%a后面数字: !v:~1!
- set "v="
- ))>b.txt
复制代码
作者: forfiles 时间: 2012-9-20 23:54
回复 6# ketop
数据总量大概有多少?
能否上传部分真实数据方便测试?
作者: ketop 时间: 2012-9-21 00:01
怎么都没有人解决呢?
作者: forfiles 时间: 2012-9-21 00:17
回复 9# ketop
抽个时间回复一下7楼和8楼吧
作者: terse 时间: 2012-9-21 01:35
本帖最后由 terse 于 2012-9-21 02:47 编辑
也没排序- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in (1.txt) do (
- set "i="
- for %%j in (%%i) do (
- set /a "_!i!_%%j+=1"
- set i=%%j
- )
- )
- for /l %%i in (0 1 9) do (
- for /l %%j in (0 1 9) do if defined _%%i_%%j (set "var=!var! %%j-!_%%i_%%j!次") else set "var=!var! %%j-0次"
- echo;%%i后面:!var!&set var=
- )
- pause
复制代码
作者: ketop 时间: 2012-9-21 02:02
回复 11# terse
为什么我测试了不成功啊?
作者: ketop 时间: 2012-9-21 02:05
回复 7# apang
我测试了,不行,不知道是不是文本内容太大的缘故。
作者: terse 时间: 2012-9-21 02:46
回复 12# ketop
把你的文本发上来 文本大应该是一个因素
另 上面代码 漏写一处 已经改
其实 发上来看到 7楼一个思路
作者: 全天占线 时间: 2012-9-21 03:20
- gawk "{for(i=2;i<NF;i++){$($(i-1)$i)++};for(i=0;i<=9;i++){print i,$(0i)}}" 1.txt|sort /+2
复制代码
作者: forfiles 时间: 2012-9-21 08:28
回复 13# ketop
请把测试数据和测试结果贴出来,否则单凭“不行”二字别人很难知道如何继续帮助你。
作者: yyykkkyyyy 时间: 2012-9-23 23:30
确实应该把情况说详细些, 估计是一行字符太多... 拼凑了一段 —— 针对文本仅一长行 为输出整齐一点, 取每个统计数最多3位数 (不然修改这句 set/p "= %%a 有!b.:~-3!")- @echo off <nul 3<1.txt
- setlocal enabledelayedexpansion
- :lp
- set a=&set/p a=
- if "%a%"=="" goto :next
- if "%a: =%"=="" goto :next
- for %%b in (%a%)do (
- set/a y!o!%%b+=1
- set "o=%%b"
- )
- goto :lp
- :next
- for /L %%i in (0 1 9)do for /L %%j in (0 1 9)do (
- set/a "u=!y%%i%%j!+100000"
- set/a "#%%i#!u!#%%j=!y%%i%%j!+0"
- )
- (for /L %%h in (0 1 9)do (
- set/p"=%%h 后:"
- set n=0
- for /f "tokens=3,4 delims=#=" %%a in ('set #%%h')do (
- set "b.= %%b"
- set/p "= %%a 有!b.:~-3!"
- if !n! neq 9 set/p "i=, "
- set/a n+=1
- )
- echo\
- ))<nul>2.txt
- endlocal<nul 4<con
- pause
复制代码
作者: ketop 时间: 2012-9-26 18:14
谢谢各位,问题已经有人帮解决了,谢谢!
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |