标题: [文本处理] bat 处理文本另类去重?? [打印本页]
作者: idc878787 时间: 2022-11-20 12:56 标题: bat 处理文本另类去重??
bat 处理文本另类去重??
文本1.txt
111
222
====
111
111
222
222
333
333
444
444
555
666
去重后 生成文本2.txt
111
222
====
111
222
333
333
444
444
555
666
作者: qixiaobin0715 时间: 2022-11-21 09:00
本帖最后由 qixiaobin0715 于 2022-11-21 09:28 编辑
实际上也不算另类,bat文件和1.txt文件均另存为ANSI编码:- @echo off
- (for /f "delims=" %%a in (1.txt) do (
- echo,%%a
- set /a n+=1
- if "%%a"=="====" goto :a
- ))>2.txt
- :a
- setlocal enabledelayedexpansion
- (for /f "skip=%n% delims=" %%i in ('type 1.txt^|sort') do (
- if not "!str!"=="%%i" echo,%%i
- set str=%%i
- ))>>2.txt
- pause
复制代码
作者: qixiaobin0715 时间: 2022-11-21 09:30
回复 1# idc878787
想简单了,因为有goto语句,标签放在括号内会出问题。
已修改。
作者: 77七 时间: 2022-11-21 09:32
回复 3# qixiaobin0715
刚才我也试了,闪退...我怀疑我错了...
不过大神好像有点理解偏差,是对====上方存在的,去重下方的
作者: hfxiang 时间: 2022-11-21 09:51
将- 111
- 222
- ====
- 111
- 111
- 222
- 222
- 333
- 333
- 444
- 444
- 555
- 666
复制代码
以ANSI编码格式保存为1.txt
下载gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe )
执行- gawk "NR==1,/====/{a[$0]=1;print;next}{if($0 in a){if(a[$0]){print;a[$0]=0}next}}1" 1.txt>2.txt
复制代码
结果(2.txt)- 111
- 222
- ====
- 111
- 222
- 333
- 333
- 444
- 444
- 555
- 666
复制代码
作者: qixiaobin0715 时间: 2022-11-21 09:56
回复 4# 77七
修改后的应当可以,你可以再试试。
我这里测试没问题
作者: 77七 时间: 2022-11-21 10:00
回复 6# qixiaobin0715
代码正常运行了,结果不对,====上方有的,就不去重了,大神再仔细看看..
作者: qixiaobin0715 时间: 2022-11-21 10:07
回复 7# 77七
测试过程:- C:\Users\Administrator\Desktop>type 1.txt
- 111
- 222
- ====
- 111
- 111
- 222
- 222
- 333
- 333
- 444
- 444
- 555
- 666
-
- C:\Users\Administrator\Desktop>type test2.bat
- @echo off
- (for /f "delims=" %%a in (1.txt) do (
- echo,%%a
- set /a n+=1
- if "%%a"=="====" goto :a
- ))>2.txt
- :a
- setlocal enabledelayedexpansion
- (for /f "skip=%n% delims=" %%i in ('type 1.txt^|sort') do (
- if not "!str!"=="%%i" echo,%%i
- set str=%%i
- ))>>2.txt
- pause
- C:\Users\Administrator\Desktop>test2.bat
- 请按任意键继续. . .
-
- C:\Users\Administrator\Desktop>type 2.txt
- 111
- 222
- ====
- 111
- 222
- 333
- 444
- 555
- 666
-
- C:\Users\Administrator\Desktop>
复制代码
作者: 77七 时间: 2022-11-21 10:25
本帖最后由 77七 于 2022-11-21 10:28 编辑
回复 8# qixiaobin0715
111
222
====
111
222
333
333
444
444
555
666
楼主的结果...和你的不一样的..
作者: qixiaobin0715 时间: 2022-11-21 10:28
回复 9# 77七
想当然了,确实如此。
作者: qixiaobin0715 时间: 2022-11-21 11:10
本帖最后由 qixiaobin0715 于 2022-11-21 11:14 编辑
回复 9# 77七
这样呢:- @echo off
- (for /f "delims=" %%a in (1.txt) do (
- echo,%%a
- set _"%%a"=true
- set /a n+=1
- if "%%a"=="====" goto :a
- ))>2.txt
- :a
- setlocal enabledelayedexpansion
- (for /f "skip=%n% delims=" %%i in ('type 1.txt^|sort') do (
- if not defined _"%%i" (
- echo,%%i
- ) else (
- if not "!str!"=="%%i" echo,%%i
- )
- set str=%%i
- ))>>2.txt
- pause
复制代码
作者: qixiaobin0715 时间: 2022-11-21 11:33
本帖最后由 qixiaobin0715 于 2022-11-21 11:40 编辑
只是存在一个致命的问题,2楼11楼代码运行去重生成的新文件,分割线下面的文本行会重新排序。
如果不介意顺序重排问题,可以使用11楼代码。
作者: 77七 时间: 2022-11-21 11:58
回复 12# qixiaobin0715
可以了,我运行11楼代码顺序也是对的
作者: qixiaobin0715 时间: 2022-11-21 12:39
回复 13# 77七
那是因为楼主提供的样本是按正序排列的。巧合!!!
作者: qixiaobin0715 时间: 2022-11-24 09:50
如果要保持文本行原有顺序,可以这样:- @echo off
- (for /f "delims=" %%a in (1.txt) do (
- echo,%%a
- set _"%%a"=true
- set /a n+=1
- if "%%a"=="====" goto :a
- ))>2.txt
- :a
- setlocal enabledelayedexpansion
- (for /f "skip=%n% delims=" %%i in ('type 1.txt') do (
- if not defined _"%%i" (
- echo,%%i
- ) else (
- if "!_"%%i"!"=="true" (
- echo,%%i
- set _"%%i"==false
- )
- )
- ))>>2.txt
- pause
复制代码
作者: terse 时间: 2022-11-24 11:13
本帖最后由 terse 于 2022-11-24 11:25 编辑
- @echo off
- set "ture="
- (for /f "delims=" %%i in (x.txt) do (
- if defined ture (
- if defined _%%i (
- if not defined #%%i echo;%%i&set #%%i=a
- ) else echo;%%i
- ) else echo;%%i&set _%%i=a
- if "%%i" == "====" set "ture=a"
- ))>2.txt
- pause
复制代码
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |