标题: [文本处理] 批处理怎样提取一个文本内容里的不重复行并输出? [打印本页]
作者: wh1234567 时间: 2011-6-5 13:07 标题: 批处理怎样提取一个文本内容里的不重复行并输出?
批处理提取一个文本内容里的不重复行并输出,如何实现?
我有一个文本,里面有好多行,要求提取不重复的行,例如
原文本1:
4344
你1好11
4334
222
你1好
4535
不过
天天4
4334
不过
你1好11
处理后并输出的文本2为:
4344
222
你1好
4535
天天4
作者: CrLf 时间: 2011-6-5 13:20
楼主为什么总是问重复的问题
作者: 601997526 时间: 2011-6-5 14:06
- for /f "delims=" %%i in (1.txt) do (if not defined %%i echo,%%i >>2.txt&set "%%i=a")
复制代码
作者: wh1234567 时间: 2011-6-5 15:23
3# 601997526
答非所问,请仔细看要求
作者: CrLf 时间: 2011-6-5 15:32
3# 601997526
有逻辑错误
作者: wh1234567 时间: 2011-6-5 15:37
本帖最后由 wh1234567 于 2011-6-5 15:38 编辑
5# zm900612
:2
cls
echo 过滤文本重复行只提取不相同行
echo.
set /p wb=请输入要处理的[路径]文本:
set /p wb1=请输入处理后生成的[路径]文本:
for /f "delims=" %%i in (%wb%) do (
if not defined %%i set %%i=A & echo %%i>>%wb1%
)
echo 处理完成
ping /n 2 127.0.1 >nul
goto :eof
你帮我修改一下这个代码吧,修改成我标题要求的那种,只提取不相同的行
另外这个代码不支持拖拽,我想修改成支持拖拽的那种
作者: Batcher 时间: 2011-6-5 16:43
- gawk "{a[$0]++}END{for(i in a)if(a[i]==1)print i}" a.txt | more >b.txt
复制代码
作者: wh1234567 时间: 2011-6-5 17:03
7# Batcher
不能用,我没有第三方程序
作者: CrLf 时间: 2011-6-5 17:10
三个方案:
1、先找出重复行输出到2.txt,然后findstr /x /v /l /g:2.txt 1.txt,若没效果,可以吧/l换成/r
2、为每行计数出现的内容计数,然后查找值为1的行
3、将文本排序,去除相邻的重复行,再恢复原有顺序
论坛里相关旧帖很多,不再贴代码了
作者: 601997526 时间: 2011-6-5 17:50
3# 601997526
答非所问,请仔细看要求
wh1234567 发表于 2011-6-5 15:23
怎么是答非所问啦,有错误是没写完整,但大至意思还是没错呀
你在循环里把if变量改x再加两句代码不就行了
set x=%%i
set x=
作者: CrLf 时间: 2011-6-5 17:53
怎么是答非所问啦,有错误是没写完整,但大至意思还是没错呀
你在循环里把if变量改x再加两句代码不就行了
set x=%%i
set x=
601997526 发表于 2011-6-5 17:50
不是笔误,是逻辑错误。
作者: wh1234567 时间: 2011-6-5 18:33
能不能完整一下代码
作者: chenqldiy 时间: 2011-6-5 18:36
本帖最后由 chenqldiy 于 2011-6-5 22:06 编辑
这种贴子在论坛有很多,我前几天就问过一次咯,你可以找找我发的贴看看
就楼主的要求,上面的内容没有特殊符号,可以用这个
下面的代码处的效果不是最后结果,你要的话套多一层"!str:%%a=!"=="!str!"- @echo off
- setlocal enableDelayedExpansion
- set str=,
- for /f %%i in (1.txt) do (
- for /f %%a in (",!i!,") do if "!str:%%a=!"=="!str!" (
- set str=,!n!!str!
- )
- )
- for %%a in (!str!) do echo %%a>>2.txt
复制代码
有时候你翻下论坛的资料改下就可以O的了
作者: Batcher 时间: 2011-6-5 21:14
8# wh1234567
可以下载:
http://bbs.bathome.net/thread-3981-1-1.html
作者: wh1234567 时间: 2011-6-5 23:03
14# Batcher
用第三方命令有利有弊:可能快速准确处理,但不方便使用,例如不可能每台电脑上都有这个程序还得另外下载,所以能弄成不是第三方的批处理就好了
作者: wh1234567 时间: 2011-6-5 23:03
13# chenqldiy
你这是干啥的批处理?我有点看不懂
作者: wh1234567 时间: 2011-6-6 01:16
请高手帮我优化一下,我弄得这个批处理太慢
@echo off
setlocal enabledelayedexpansion
set a=0
echo 过滤文本重复行只提取不相同行
echo.
set /p wb=输入要处理的文件名:
set /p wb1=输入要保存的文件名:
set wb=%wb:"=%
set wb1=%wb1:"=%
for /f "delims=" %%i in ('type "%wb%"') do (
set a=0
for /f "delims=" %%j in ('type "%wb%"') do if "%%i" == "%%j" (set /a a+=1)
if "!a!" leq "1" echo %%i>>"%wb1%".txt
)
echo 处理完成
ping /n 2 127.0.1 >nul
goto :eof
作者: Batcher 时间: 2011-6-6 01:21
17# wh1234567
能否学习一下怎样使用code标签?
http://bbs.bathome.net/thread-3473-1-1.html
作者: batman 时间: 2011-6-6 01:24
楼主自己对着改:- @echo off
- (for /f "delims=" %%a in (a.txt) do if not defined "%%a" echo %%a&set ""%%a"=a")>b.txt
- start b.txt
复制代码
作者: wh1234567 时间: 2011-6-6 01:56
本帖最后由 wh1234567 于 2011-6-6 01:58 编辑
19# batman
回复版主,不是去除重复行,而是要提取不同的行,也就是将包含有重复的行全部去掉,剩下的就是没有重复过的行了,希望帮忙
例如:原文本1:
12
13
22
你好3?
13
12
处理后并输出的文本内容就是:
22
你好3?
作者: batman 时间: 2011-6-6 11:28
还是一个不通用的解:- @echo off
- for /f "delims=" %%a in (a.txt) do set /a "_%%a+=1"
- (for /f "tokens=1,2 delims==_" %%a in ('set _') do if %%b equ 1 echo %%a)>b.txt
- start b.txt
复制代码
作者: batman 时间: 2011-6-6 11:43
本帖最后由 batman 于 2011-6-6 11:47 编辑
- @echo off&setlocal enabledelayedexpansion
- rem 每行字符间不能有空格,;><&tab以及成对的!字符
- set "str= "
- for /f "delims=" %%a in (a.txt) do (
- if "!str: %%a =!" neq "!str!" (
- set "str=!str: %%a =!"
- ) else (
- set "str=!str! %%a "
- )
- )
- (for %%a in (%str%) do echo %%a)>b.txt
- start b.txt
复制代码
作者: batman 时间: 2011-6-6 12:10
vbs的,应该很通用了:- Set fso = CreateObject("scripting.filesystemobject")
- vbstr = fso.OpenTextFile("a.txt").ReadAll()
- arr = Split(vbstr, vbCrLf)
- For Each str In arr
- If InStr(vbout, str) = 0 Then
- vbout = vbout & str & vbCrLf
- Else
- vbout = Replace(vbout, str, "$@#^&><")
- End If
- Next
- fso.OpenTextFile("b.txt", 2, True).Write Replace(vbout, "$@#^&><" & vbCrLf, "")
- MsgBox "ok"
复制代码
作者: abcdshenji 时间: 2011-6-6 14:11
- @echo off
- (for /f "delims= eol=" %%i in ('"type 1.txt|findstr ".*""') do (
- if not defined %%i (echo;%%i) else call,set "#=%%#%%%%i "
- set "%%i=0"
- ))>#
- findstr /v /i "%#%" #>2.txt&del #
复制代码
作者: wh1234567 时间: 2011-6-6 14:37
23# batman
处理速度很快,但就是处理后多出了一行
作者: ghl621 时间: 2011-6-9 14:54
看看学习!学习!
作者: ghl621 时间: 2011-6-9 14:54
看看学习!学习!
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |