Board logo

标题: [文本处理] [已解决]批处理如何查找出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 编辑

给你的是思路,重复字的不就是么
  1. @echo off
  2. for /f "delims=" %%a in (data.txt) do (
  3.   for %%b in (%%a) do (   
  4.     if defined #%%b set /p =%%b <nul
  5.     set #%%b=1
  6.   )
  7.   for /f "tokens=1 delims==" %%c in ('set #') do set %%c=
  8.   echo.
  9. )
  10. 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

  1. """
  2. python3取出重复3次的字符串保存为3列.py
  3. http://bbs.bathome.net/thread-39592-1-1.html
  4. codegay 2016年3月8日 00:56:57
  5. """
  6. #测试数据
  7. a="""
  8. 01 01 01 02 02 02 03 03 03 04 05 05
  9. 04 04 05 04 05 05 06 06 06 07 07 08
  10. 07 08 09 07 08 08 07 09 09 10 11 12
  11. """
  12. with open("a.txt","w+") as f:
  13.     f.write(a)
  14. #python3取出重复3次的字符串保存为3列.py
  15. with open("a.txt") as f:
  16.     txt=f.read().split()
  17. t3=[]
  18. [t3.append(r) for r in txt if (r not in t3) and txt.count(r)>=3]
  19. #N为结果输出为多少列
  20. N=3
  21. r3=[' '.join(t3[r:r+N])+"\n" for r in range(0,len(t3),N)]
  22. print(r3)
  23. with open("out.txt","w+") as f:
  24.     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 编辑
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. (for /f "delims=" %%a in (a.txt) do (
  4.   for %%b in (%%a) do (
  5.     set /a #%%b+=1
  6.     if !#%%b!==3 set /p =%%b <nul
  7.   )
  8.   echo.
  9. ))>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


    不会举例麻烦用原始数据!!!!!
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. (for /f "delims=" %%a in (a.txt) do (
  4.   for %%b in (%%a) do (
  5.     set /a #%%b+=1
  6.     if !#%%b!==3 set /p =%%b <nul
  7.   )
  8.   echo.
  9.   for /f "tokens=1-2 delims==" %%c in ('set #') do set %%c=
  10. ))>b.txt
复制代码

作者: qzwifi    时间: 2016-3-8 12:20

回复 13# happy886rr

你好,非常感谢。你的结果是正确的没错。我自己加保存没有保存下来。
作者: happy886rr    时间: 2016-3-8 12:23

回复 15# qzwifi

  直接拖拽txt到批处理上运行,txt文件路径不要有空格
    那肯定没错啊,因为我把所有要出现的漏洞都考虑进去了,下面是保存的代码
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. REM 设置重复次数
  4. set N=3
  5. pushd "%~dp0"
  6. (for /f "delims=" %%a in (%1) do (
  7. for %%b in (%%a) do (
  8. if defined #%%b (set /a #%%b+=1) else (set #%%b=1)
  9. )
  10. for /f "tokens=1 delims=#=" %%c in ('set #') do (
  11. if !#%%c! equ !N! (set /p = %%c <nul)
  12. set #%%c=<nul
  13. )
  14. echo.
  15. ))>.\b.txt
  16. 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

  1. @if (0)==(0) echo off
  2. cscript //nologo //e:jscript "%~0" < a.txt > b.txt
  3. pause & exit
  4. @end
  5. while(!WSH.StdIn.AtEndOfStream){
  6.     var arr = WSH.StdIn.ReadLine().match(/\S+/g);
  7.     if (arr) {
  8.         var m = [], s = arr.sort().join(' ') + ' ';
  9.         s.replace(/(\S+ )\1*/g,
  10.             function(a,b){if(a.split(' ').length == 4) m.push(b)}
  11.         )
  12.         WSH.Echo(m.join(''));
  13.     }
  14. }
复制代码

作者: WHY    时间: 2016-3-8 14:04

本帖最后由 WHY 于 2016-3-8 19:30 编辑

test.ps1
  1. get-Content a.txt | `
  2. ?{$_ -NotMatch '^\s*$'} | %{
  3.     $arr = [regex]::Matches($_, '\S+') | %{ $_.Value }
  4.     $arr = $arr | Group | ?{$_.Count -eq 3} | %{ $_.Name }
  5.     $arr -join ' '
  6. }>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
  1. @echo off
  2. rem 指定查找重复的次数
  3. set n=2
  4. 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"
  5. pause
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2