标题: [文本处理] [已解决]批处理如何查找出txt文本里每一行内容中重复出现指定次数的字符串? [打印本页]
作者: qzwifi 时间: 2016-1-8 10:15 标题: [已解决]批处理如何查找出txt文本里每一行内容中重复出现指定次数的字符串?
本帖最后由 pcl_test 于 2016-8-9 23:56 编辑
例:
a.txt文本内容为:
01 02 03 01 02
04 05 06 04 06
07 08 09 10 11 10
处理保存为b.txt:
01 02
04 06
10
就是将文本行字符出现2次的保存下来,
文本内容行字串存在个数长度不等的情况。
保存为b.txt
作者: 回家路上 时间: 2016-1-8 10:34
http://www.bathome.net/viewthrea ... =%C7%A7%D7%D6%CE%C4
作者: qzwifi 时间: 2016-1-8 10:46
回复 2# 回家路上
你好,页面上的代码依次试过,没有用。看标题本身与我需要的也有不符。
作者: flyinnet9 时间: 2016-1-8 10:59
本帖最后由 flyinnet9 于 2016-1-8 12:07 编辑
给你的是思路,重复字的不就是么- @echo off
- for /f "delims=" %%a in (data.txt) do (
- for %%b in (%%a) do (
- if defined #%%b set /p =%%b <nul
- set #%%b=1
- )
- for /f "tokens=1 delims==" %%c in ('set #') do set %%c=
- echo.
- )
- pause
复制代码
作者: qzwifi 时间: 2016-1-8 11:27
回复 4# flyinnet9
请问为何我按上述代码来只能处理第一行,其它的不行呢? 补充一下文本内容行字串存在个数长度、排序不等的情况。
作者: flyinnet9 时间: 2016-1-8 11:33
回复 5# qzwifi
上面的代码按你给的例子写的,如果和例子不同,结果有差异也很正常,要么给完整的例子,要么自己写
作者: qzwifi 时间: 2016-1-8 11:42
回复 6# flyinnet9
可是我的例子与我要处理的是一样的只是字串长了与行数多了,
每行的字串要么只有出现一次,要么出现2次,不存在出现3次或以上的。有的一行有4、5十个字串。把出现2次的保存,出现1次的不要!
我试您的代码例子没问题。请问这种情况一般会是什么原因造成的呢?我自己把懂的能试的都试了下,以您的代码改。都不行。
作者: qzwifi 时间: 2016-1-8 11:49
本帖最后由 qzwifi 于 2016-1-8 11:55 编辑
回复 6# flyinnet9
如下例就不行:
一:01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 13 14 15 16
二:01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 01 11 21 31
三:01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 10 20 30
处理完后是:
一:13 14 15 16
二:01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 42 01 11 21 31
三:01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 10 20 30
只有第一行可以
作者: flyinnet9 时间: 2016-1-8 12:08
回复 8# qzwifi
4楼已改
作者: qzwifi 时间: 2016-3-8 00:45 标题: [已解决]批处理如何找出文本各行内容中出现3次的字串?
本帖最后由 qzwifi 于 2016-3-8 12:35 编辑
例:
a.txt文本内容为:
01 01 01 02 02 02 03 03 03 04 05 05
04 04 05 04 05 05 06 06 06 07 07 08
07 08 09 07 08 08 07 09 09 10 11 12
处理保存为b.txt:
01 02 03
04 05 06
07 08 09
将文本行字符出现3次的保存下来,处理完成保存为b.txt
注:文本内容行字符存在个数长度不等的情况
以下是论坛上的朋友写的找出现2次的代码:
http://www.bathome.net/redirect. ... 0956&ptid=38999
作者: codegay 时间: 2016-3-8 01:20
- """
- python3取出重复3次的字符串保存为3列.py
- http://bbs.bathome.net/thread-39592-1-1.html
- codegay 2016年3月8日 00:56:57
-
- """
-
- #测试数据
- a="""
- 01 01 01 02 02 02 03 03 03 04 05 05
- 04 04 05 04 05 05 06 06 06 07 07 08
- 07 08 09 07 08 08 07 09 09 10 11 12
- """
- with open("a.txt","w+") as f:
- f.write(a)
-
- #python3取出重复3次的字符串保存为3列.py
- with open("a.txt") as f:
- txt=f.read().split()
-
- t3=[]
- [t3.append(r) for r in txt if (r not in t3) and txt.count(r)>=3]
-
- #N为结果输出为多少列
- N=3
- r3=[' '.join(t3[r:r+N])+"\n" for r in range(0,len(t3),N)]
-
- print(r3)
- with open("out.txt","w+") as f:
- f.writelines(r3)
复制代码
作者: qzwifi 时间: 2016-3-8 02:00
回复 2# codegay
感谢楼上提供的代码,请问可以直接写bat操作的吗?哪位可以写一下。不安装python3的。谢谢!
作者: flyinnet9 时间: 2016-3-8 09:56
本帖最后由 flyinnet9 于 2016-3-8 10:22 编辑
- @echo off
- setlocal ENABLEDELAYEDEXPANSION
- (for /f "delims=" %%a in (a.txt) do (
- for %%b in (%%a) do (
- set /a #%%b+=1
- if !#%%b!==3 set /p =%%b <nul
- )
- echo.
- ))>b.txt
复制代码
作者: qzwifi 时间: 2016-3-8 10:16
回复 4# flyinnet9
你好,你的代码运行后是空白文本,没有得出保存结果。望能修改一下
作者: flyinnet9 时间: 2016-3-8 10:20
回复 5# qzwifi
和a.txt放同一个目录
作者: qzwifi 时间: 2016-3-8 10:22
本帖最后由 qzwifi 于 2016-3-8 10:25 编辑
回复 6# flyinnet9
是放在同一目录的,里面只有文本换行符的空白文本。
作者: flyinnet9 时间: 2016-3-8 10:22
回复 7# qzwifi
已改
作者: qzwifi 时间: 2016-3-8 10:30
回复 8# flyinnet9
你好,修改的运行后只有第一行可以正确保存。其它的行还是换行符。请给完善一下,非常感谢!
作者: flyinnet9 时间: 2016-3-8 11:06
回复 9# qzwifi
我这边测试没问题,把你的原始文件发过来看看
作者: qzwifi 时间: 2016-3-8 12:03
回复 10# flyinnet9
你好,如:
01 02 03 04 04 05 05 05 06 06 07 08 09 10 11 11 11 12 12 12
01 03 03 04 04 05 05 06 06 07 07 08 10 10 11 11 12 12 12 13 13 13
01 01 02 03 03 04 04 05 05 06 07 07 07 08 09 09
运行后得:
05 11 12
03 04 06 07 10 13
01 08 09
而正确的应该是:
05 11 12
12 13
07
作者: flyinnet9 时间: 2016-3-8 12:19
回复 12# qzwifi
不会举例麻烦用原始数据!!!!!- @echo off
- setlocal ENABLEDELAYEDEXPANSION
- (for /f "delims=" %%a in (a.txt) do (
- for %%b in (%%a) do (
- set /a #%%b+=1
- if !#%%b!==3 set /p =%%b <nul
- )
- echo.
- for /f "tokens=1-2 delims==" %%c in ('set #') do set %%c=
- ))>b.txt
复制代码
作者: qzwifi 时间: 2016-3-8 12:20
回复 13# happy886rr
你好,非常感谢。你的结果是正确的没错。我自己加保存没有保存下来。
作者: happy886rr 时间: 2016-3-8 12:23
回复 15# qzwifi
直接拖拽txt到批处理上运行,txt文件路径不要有空格
那肯定没错啊,因为我把所有要出现的漏洞都考虑进去了,下面是保存的代码- @echo off
- setlocal enabledelayedexpansion
- REM 设置重复次数
- set N=3
- pushd "%~dp0"
- (for /f "delims=" %%a in (%1) do (
- for %%b in (%%a) do (
- if defined #%%b (set /a #%%b+=1) else (set #%%b=1)
- )
- for /f "tokens=1 delims=#=" %%c in ('set #') do (
- if !#%%c! equ !N! (set /p = %%c <nul)
- set #%%c=<nul
- )
- echo.
- ))>.\b.txt
- start .\b.txt
复制代码
作者: qzwifi 时间: 2016-3-8 12:32
本帖最后由 qzwifi 于 2016-3-8 13:07 编辑
回复 15# happy886rr
OK
作者: qzwifi 时间: 2016-3-8 12:42
回复 17# happy886rr
可以了,谢谢!
作者: WHY 时间: 2016-3-8 14:01
- @if (0)==(0) echo off
- cscript //nologo //e:jscript "%~0" < a.txt > b.txt
- pause & exit
- @end
-
- while(!WSH.StdIn.AtEndOfStream){
- var arr = WSH.StdIn.ReadLine().match(/\S+/g);
- if (arr) {
- var m = [], s = arr.sort().join(' ') + ' ';
- s.replace(/(\S+ )\1*/g,
- function(a,b){if(a.split(' ').length == 4) m.push(b)}
- )
- WSH.Echo(m.join(''));
- }
- }
复制代码
作者: WHY 时间: 2016-3-8 14:04
本帖最后由 WHY 于 2016-3-8 19:30 编辑
test.ps1- get-Content a.txt | `
- ?{$_ -NotMatch '^\s*$'} | %{
- $arr = [regex]::Matches($_, '\S+') | %{ $_.Value }
- $arr = $arr | Group | ?{$_.Count -eq 3} | %{ $_.Name }
- $arr -join ' '
- }>b.txt
复制代码
作者: pcl_test 时间: 2016-8-10 00:44
本帖最后由 pcl_test 于 2016-8-10 15:51 编辑
第三方http://www.bathome.net/s/tool/index.html?key=gawk- @echo off
- rem 指定查找重复的次数
- set n=2
- gawk -v n=%n% "{delete a;s=\"\";for(i=1; i<=NF; i++)a[$i]++;for(b in a){if(a[b]==n)s=s\" \"b };print s}" "1.txt">"2.txt"
- pause
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |