标题: [文本处理] 批处理如何提取文本中开头前五个字符相同的行中后五位数值最大的行 [打印本页]
作者: 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
试试看- @echo off&setlocal enabledelayedexpansion
- (for /f "delims=" %%a in ('sort /r aa.txt') do (
- set "a=%%a"
- if "!a:~,5!" neq "!b:~,5!" echo,!a!
- set "b=%%a"
- ))>bb.txt
- pause
复制代码
作者: necnec1 时间: 2013-3-30 01:50
回楼上的 我那数据有150万左右 那批处理运行了好几个小时还没动静 呵呵 好慢的说
作者: CrLf 时间: 2013-3-30 03:52
本帖最后由 CrLf 于 2013-3-30 03:59 编辑
纯批,这方案在碰到数据量大时会非常慢:- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (a.txt) do (
- set str=%%a
- set $!str:~,5!=!str:~5!
- )
- (for /f "tokens=1* delims=$=" %%a in ('set $ ') do echo %%a%%b)>b.txt
- pause
复制代码
另一个方案,sort+sed,其中sed需要下载:- sort a.txt|sed -n "H;${g;s/\(\<.....\).....*\1/\1/g;s/^\n//;p}">b.txt
复制代码
作者: apang 时间: 2013-3-30 12:33
vbs试试?应该比纯批快- Set fso = CreateObject("Scripting.FileSystemObject")
- Set dic = CreateObject("Scripting.Dictionary")
- Set file = fso.OpenTextFile("aa.txt")
-
- Do until file.AtEndOfStream
- strLine = RegEx(file.ReadLine)
- If strLine <> "" Then
- str1 = Left(strLine,5) : str2 = Right(strLine,5)
- IF Not dic.Exists(str1) Then
- dic.Add str1,str2
- Else
- dic.Item(str1) = dic.Item(str1) & vbLf & str2
- End If
- End If
- Loop
-
- a = dic.Keys
- For i = 0 to UBound(a)
- b = Split(dic.Item(a(i)),vbLf)
- Max = "00000"
- For j = 0 to UBound(b)
- If b(j) > Max Then Max = b(j)
- Next
- str = str & a(i) & Max & vbCrLf
- Next
- fso.CreateTextFile("bb.txt",True).Write Str
-
- MsgBox "OK"
-
- Function RegEx(strLine)
- Set re = New RegExp
- re.Pattern = "\s+"
- re.Global = True
- RegEx = re.Replace(StrLine,"")
- End Function
复制代码
作者: powerbat 时间: 2013-3-30 13:22
- @set @n=0/*
- @echo off
- sort aa.txt | cscript.exe -nologo -e:jscript "%~f0" %*
- pause
- exit/b*/
-
- WScript.StdIn.ReadAll().replace(
- /^(\w{5})\d{5}(?=\r\n(?!\1).*$)/gm,
- function(s){WScript.Echo(s);}
- );
复制代码
作者: apang 时间: 2013-3-30 13:47
回复 6# powerbat
大神好久不见。。。
作者: terse 时间: 2013-3-30 23:25
gawk- sort /r aa.txt|gawk "!s[substr($0,0,5)]++" >bb.txt
复制代码
作者: CrLf 时间: 2013-3-31 00:52
一个比一个邪恶
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |