Board logo

标题: [文本处理] 批处理如何提取文本中开头前五个字符相同的行中后五位数值最大的行 [打印本页]

作者: necnec1    时间: 2013-3-29 11:25     标题: 批处理如何提取文本中开头前五个字符相同的行中后五位数值最大的行

本帖最后由 pcl_test 于 2016-9-20 23:39 编辑

批处理怎样精减文本内容?
R1E0030014
C3AP004345
D1EC013342
Q2ECA00875
R1E0030055
R1E0030054
D1EC023342
C3AP002345


上面的例子  文本文件AA.TXT   前五位不要动 是固定的 后五位是数字 最小是00001最大是99999
举个例子  R1E00这一组总共有3个  30014  30054 30055
说的简单点就是把最大的R1E0030055 提取出来就行了 其他不要

最后的结果如下
R1E0030055
C3AP004345
D1EC023342
Q2ECA00875
作者: apang    时间: 2013-3-29 13:41

试试看
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=" %%a in ('sort /r aa.txt') do (
  3.    set "a=%%a"
  4.    if "!a:~,5!" neq "!b:~,5!" echo,!a!
  5.    set "b=%%a"
  6. ))>bb.txt
  7. pause
复制代码

作者: necnec1    时间: 2013-3-30 01:50

回楼上的 我那数据有150万左右  那批处理运行了好几个小时还没动静 呵呵 好慢的说
作者: CrLf    时间: 2013-3-30 03:52

本帖最后由 CrLf 于 2013-3-30 03:59 编辑

纯批,这方案在碰到数据量大时会非常慢:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (a.txt) do (
  3. set str=%%a
  4. set $!str:~,5!=!str:~5!
  5. )
  6. (for /f "tokens=1* delims=$=" %%a in ('set $ ') do echo %%a%%b)>b.txt
  7. pause
复制代码
另一个方案,sort+sed,其中sed需要下载:
  1. sort a.txt|sed -n "H;${g;s/\(\<.....\).....*\1/\1/g;s/^\n//;p}">b.txt
复制代码

作者: apang    时间: 2013-3-30 12:33

vbs试试?应该比纯批快
  1. Set fso = CreateObject("Scripting.FileSystemObject")
  2. Set dic = CreateObject("Scripting.Dictionary")
  3. Set file = fso.OpenTextFile("aa.txt")
  4. Do until file.AtEndOfStream
  5.    strLine = RegEx(file.ReadLine)
  6.    If strLine <> "" Then
  7.       str1 = Left(strLine,5) : str2 = Right(strLine,5)
  8.       IF Not dic.Exists(str1) Then
  9.          dic.Add str1,str2
  10.       Else
  11.          dic.Item(str1) = dic.Item(str1) & vbLf & str2
  12.       End If
  13.    End If
  14. Loop
  15. a = dic.Keys
  16. For i = 0 to UBound(a)
  17.    b = Split(dic.Item(a(i)),vbLf)
  18.    Max = "00000"
  19.    For j = 0 to UBound(b)
  20.       If b(j) > Max Then Max = b(j)
  21.    Next
  22.    str = str & a(i) & Max & vbCrLf
  23. Next
  24. fso.CreateTextFile("bb.txt",True).Write Str
  25. MsgBox "OK"
  26. Function RegEx(strLine)
  27.    Set re = New RegExp
  28.    re.Pattern = "\s+"
  29.    re.Global = True
  30.    RegEx = re.Replace(StrLine,"")
  31. End Function
复制代码

作者: powerbat    时间: 2013-3-30 13:22

  1. @set @n=0/*
  2. @echo off
  3. sort aa.txt | cscript.exe -nologo -e:jscript "%~f0" %*
  4. pause
  5. exit/b*/
  6. WScript.StdIn.ReadAll().replace(
  7.   /^(\w{5})\d{5}(?=\r\n(?!\1).*$)/gm,
  8.   function(s){WScript.Echo(s);}
  9. );
复制代码

作者: apang    时间: 2013-3-30 13:47

回复 6# powerbat


    大神好久不见。。。
作者: terse    时间: 2013-3-30 23:25

gawk
  1. sort /r aa.txt|gawk "!s[substr($0,0,5)]++" >bb.txt
复制代码

作者: CrLf    时间: 2013-3-31 00:52

一个比一个邪恶




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