[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

本帖最后由 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

一个比一个邪恶

TOP

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

TOP

回复 6# powerbat


    大神好久不见。。。

TOP

  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. );
复制代码

TOP

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
复制代码

TOP

本帖最后由 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
复制代码

TOP

回楼上的 我那数据有150万左右  那批处理运行了好几个小时还没动静 呵呵 好慢的说

TOP

试试看
  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
复制代码

TOP

返回列表