标题: [文本处理] 【已解决】求助批处理文件夹内所有文本合并后,提取重复数为N的字符 [打印本页]
作者: 思想之翼 时间: 2023-4-15 15:15 标题: 【已解决】求助批处理文件夹内所有文本合并后,提取重复数为N的字符
本帖最后由 思想之翼 于 2023-4-16 18:23 编辑
d:\data1\内有若干文本,欲将文件夹内所有文本合并后,提取重复数为7的字符,写入d:\data2\B.txt;若没有重复数为7的字符,则B.txt为空。
每个文本记录字符的格式如下:
00000 00001
00003
00004 00005 00006
...
作者: 77七 时间: 2023-4-15 16:21
- @echo off
- cd /d "d:\data1\"
- (type *.txt >>xxx.temp) 1>nul
- for /f "delims=" %%a in (xxx.temp) do (
- for %%b in (%%a) do (
- set/a #%%b+=1
- )
- )
- cd.>d:\data2\B.txt
- setlocal enabledelayedexpansion
- (for /f "delims=" %%a in (xxx.temp) do (
- for %%b in (%%a) do (
- if !#%%b! equ 7 (
- echo %%b
- set /a #%%b+=1
- )
- )
- ))>d:\data2\B.txt
- endlocal
- del xxx.temp
- pause
复制代码
不合并也可以,就是文本过多,可能会影响效率。昨天”优化“那个帖子代码,中间的延迟变量就是为了单独计数每个文本,去掉之后就是所有文本一起计数。
code 不合并
- @echo off
- cd /d "d:\data1\"
- for /r %%i in (*.txt) do (
- for /f "delims=" %%a in ('type "%%i"') do (
- for %%b in (%%a) do (
- set/a #%%b+=1
- )
- )
- )
- cd.>d:\data2\B.txt
- setlocal enabledelayedexpansion
- (for /r %%i in (*.txt) do (
- for /f "delims=" %%a in ('type "%%i"') do (
- for %%b in (%%a) do (
- if !#%%b! equ 7 (
- echo %%b
- set /a #%%b+=1
- )
- )
- )
- ))>d:\data2\B.txt
- endlocal
- pause
复制代码
作者: 思想之翼 时间: 2023-4-15 16:34
本帖最后由 思想之翼 于 2023-4-15 16:39 编辑
回复 2# 77七
感谢!合并文件夹内所有文本,是中间过程,觉得没必要输出,可以将所有文本数据读入内存,在内存中提取重复数为N的字符,然后输出。
作者: 77七 时间: 2023-4-15 16:54
回复 3# 思想之翼
直接 in ('type *.txt') ,好方法!学习了!
作者: buyiyang 时间: 2023-4-15 16:58
回复 2# 77七
10行以后也可以这样- (for /f "tokens=1,2 delims=#=" %%a in ('set #') do (
- if %%b equ 7 (echo,%%a)
- ))>d:\data2\B.txt
- pause
复制代码
作者: 77七 时间: 2023-4-15 17:03
本帖最后由 77七 于 2023-4-15 17:10 编辑
回复 5# buyiyang
学习了!很久以前见到过 set # 这种用法,一直不是很理解。在这个实例中,会不会 存在 计数为8的,也被统计出来呢
试了一下,好像不会
作者: buyiyang 时间: 2023-4-15 17:13
回复 6# 77七
为什么说计数为8的可能会被统计出来呢?set #是列出所有#开头的变量及值,if %%b equ 7选择了值为7的变量
作者: 77七 时间: 2023-4-15 17:26
回复 7# buyiyang
我太业余了。我以为的 set #的结果是这样的...- ...
- #00001=6
- #00001=7
- #00001=8
复制代码
作者: 77七 时间: 2023-4-15 17:43
本帖最后由 77七 于 2023-4-15 17:44 编辑
- @echo off
- cd /d "d:\data1\"
- for /f "delims=" %%a in ('type *.txt') do (
- for %%b in (%%a) do (
- set/a #%%b+=1
- )
- )
- cd.>d:\data2\B.txt
- (for /f "tokens=1,2 delims=#=" %%a in ('set #') do (
- if %%b equ 7 (
- echo %%a
- )
- ))>d:\data2\B.txt
- pause
复制代码
综合3楼 5楼的方法,再贴一下代码,方便他人阅读。
代码精简、优化、改动好多,向两位老师学习!
作者: 思想之翼 时间: 2023-4-15 18:23
回复 9# 77七
环境变量 # 没有定义
作者: 77七 时间: 2023-4-15 18:43
回复 10# 思想之翼
你是改动代码了吧?如果开延迟变量,就在代码结束再关
作者: hfxiang 时间: 2023-4-16 09:58
本帖最后由 hfxiang 于 2023-4-16 13:16 编辑
回复 1# 思想之翼 - gawk "{for(i=1;i<=NF;i++)a[$i]++}END{for(i in a)if(a[i]==7)print i}" "d:\data1\*.txt">"d:\data2\B.txt"
复制代码
之前输出错写为"d:\data1\B.txt",现改正为"d:\data2\B.txt" ,因为输入输出为同1文件夹会有冲突
作者: 思想之翼 时间: 2023-4-16 15:14
本帖最后由 思想之翼 于 2023-4-16 15:34 编辑
回复 12# hfxiang
gawk: fatal: cannot open file `d:\data1\*.txt' for reading (Invalid argument)
感谢帮助!经测试,路径改正前后,都出现上述提示。
作者: buyiyang 时间: 2023-4-16 15:37
回复 13# 思想之翼
含通配符的路径去掉引号复制代码
作者: 思想之翼 时间: 2023-4-16 15:50
本帖最后由 思想之翼 于 2023-4-16 15:57 编辑
回复 14# buyiyang
感谢!经测试,上述所有代码,对于小文本,结果正确。但是对于大文本(3行 60000列),输出文本为空。
作者: buyiyang 时间: 2023-4-16 16:35
回复 15# 思想之翼
3行60000列,我测试没有问题
作者: hfxiang 时间: 2023-4-16 16:51
回复 15# 思想之翼
多数4.2.1以下版本的gawk会有100列的限制(这是3位gawk开发者最初设定的参数),高版gawk对此进行了扩展,建议用5.2.1版试试。
作者: 思想之翼 时间: 2023-4-16 17:03
本帖最后由 思想之翼 于 2023-4-16 17:13 编辑
回复 17# hfxiang
感谢
http://www.bathome.net/s/tool/index.html?down&key=gawk 4.1.3 64位
作者: 思想之翼 时间: 2023-4-16 17:04
本帖最后由 思想之翼 于 2023-4-16 17:13 编辑
回复 16# buyiyang
感谢
http://www.bathome.net/s/tool/index.html?down&key=gawk 4.1.3 64位
作者: hfxiang 时间: 2023-4-16 17:15
回复 18# 思想之翼
64位版要自行编译
https://mirrors.tuna.tsinghua.edu.cn/gnu/gawk/
32位版(下载后缺少libgcc_s_dw2-1.dll文件,可把微信的libgcc_s_dw2-1.dll文件复制到gawk文件夹下使用,它一般在"C:\Program Files\Tencent\WeChat\libgcc_s_dw2-1.dll"):
https://sourceforge.net/projects/ezwinports/files/
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |