标题: [文本处理] [已解决]批处理对比两个文本,如何给一个文本添加一次顺序序号? [打印本页]
作者: xp3000 时间: 2023-1-8 08:50 标题: [已解决]批处理对比两个文本,如何给一个文本添加一次顺序序号?
文本.txt对应文本.log
文本2.txt对应文本2.log
文本3.txt对应文本3.log
文本4.txt对应文本4.log
文本.txt:- 送胡大
- 荆门不堪别,况乃潇湘秋。
- 何处遥望君,江边明月楼。
-
- 送狄宗亨
- 秋在水清山暮蝉,洛阳树色鸣皋烟。
- 送君归去愁不尽,又惜空度凉风天。
-
- 送窦七
- 清江月色傍林秋,波上荧荧望一舟。
- 鄂渚轻帆须早发,江边明月为君留。
-
- 送柴侍御
- 沅水通波接武冈,送君不觉有离伤。
- 青山一道同云雨,明月何曾是两乡?
-
- 送郭司仓
- 映门淮水绿,留骑主人心。
- 明月随良掾,春潮夜夜深。
-
- 送任五之桂林
- 楚客醉孤舟,越水将引掉。
- 山为两乡别,月带千里貌。
- 羁谴同缯纶,僻幽闻虎豹。
- 桂林寒色在,苦节知所效。
-
- 送李十五
- 怨别秦楚深,江中秋云起。
- 天长杳无隔,月影在寒水。
-
- 送张四
- 枫林已愁暮,楚水复堪悲。
- 别后冷山月,清猿无断时。
-
- 芙蓉楼送辛渐
- 寒雨连江夜入吴,平明送客楚山孤。
- 洛阳亲友如相问,一片冰心在玉壶。
复制代码
文本.log:- 送胡大
- 送狄宗亨
- 送窦七
- 送柴侍御
- 送郭司仓
- 送任五之桂林
- 送李十五
- 送张四
- 芙蓉楼送辛渐
复制代码
读取文本.log后,查找文本.txt,将当内容相同时,便在前面添加一个序号和《》,变成:- 1、 《送胡大》
- 荆门不堪别,况乃潇湘秋。
- 何处遥望君,江边明月楼。
-
- 2、 《送狄宗亨》
- 秋在水清山暮蝉,洛阳树色鸣皋烟。
- 送君归去愁不尽,又惜空度凉风天。
-
- 3、 《送窦七》
- 清江月色傍林秋,波上荧荧望一舟。
- 鄂渚轻帆须早发,江边明月为君留。
-
- 4、 《送柴侍御》
- 沅水通波接武冈,送君不觉有离伤。
- 青山一道同云雨,明月何曾是两乡?
-
- 5、 《送郭司仓》
- 映门淮水绿,留骑主人心。
- 明月随良掾,春潮夜夜深。
-
- 6、 《送任五之桂林》
- 楚客醉孤舟,越水将引掉。
- 山为两乡别,月带千里貌。
- 羁谴同缯纶,僻幽闻虎豹。
- 桂林寒色在,苦节知所效。
-
- 7、 《送李十五》
- 怨别秦楚深,江中秋云起。
- 天长杳无隔,月影在寒水。
-
- 8、 《送张四》
- 枫林已愁暮,楚水复堪悲。
- 别后冷山月,清猿无断时。
-
- 9、 《芙蓉楼送辛渐》
- 寒雨连江夜入吴,平明送客楚山孤。
- 洛阳亲友如相问,一片冰心在玉壶。
复制代码
只添加一次,如果碰到重复的,只在首个出现的前面添加序号,
比如文本.txt
送张四是8、 《送张四》,
芙蓉楼送辛渐是9、 《芙蓉楼送辛渐》,
如果碰到- 送张四
- 枫林已愁暮,楚水复堪悲。
- 别后冷山月,清猿无断时。
-
- 芙蓉楼
- 芙蓉楼送辛渐
- 芙蓉楼送辛渐
- 寒雨连江夜入吴,平明送客楚山孤。
- 洛阳亲友如相问,一片冰心在玉壶。
复制代码
替换为:- 8、 《送张四》
- 枫林已愁暮,楚水复堪悲。
- 别后冷山月,清猿无断时。
-
- 芙蓉楼
- 9、 《芙蓉楼送辛渐》
- 芙蓉楼送辛渐
- 寒雨连江夜入吴,平明送客楚山孤。
- 洛阳亲友如相问,一片冰心在玉壶。
复制代码
作者: hfxiang 时间: 2023-1-8 09:12
如不介意,可用第3方工具gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe )来实现- gawk "NR==FNR{text[$0] = NR \"、《\" $0 \"》\";next}{if($0 in text){$0=text[$0]}}1" 文本.log 文本.txt>修改后的文本.txt
复制代码
注意,要确保“文本.log” 及 “文本.txt” 已保存为ANSI编码格式
作者: xp3000 时间: 2023-1-8 09:49
本帖最后由 xp3000 于 2023-1-10 13:44 编辑
谢谢,如果碰到两首诗同名会出错,怎么修改
作者: 77七 时间: 2023-1-8 14:16
本帖最后由 77七 于 2023-1-8 14:21 编辑
- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
- set "fileName=%%~ni"
- if exist "!fileName!.log" (
- for /f "delims=" %%a in (!fileName!.log) do (
- set "_%%a=ture"
- )
- set /a "num=0"
- for /f "delims=" %%b in ('findstr /n .* !fileName!.txt') do (
- set "str=%%b"
- set "str=!str:*:=!"
- if defined _!str! (
- if defined #!str! (
- >>xxx.temp echo,!str!
- ) else (
- set /a num=num+1
- set "#!str!=ture"
- >>xxx.temp echo,!num!、 《!str!》
- )
- ) else (
- >>xxx.temp echo,!str!
- )
- )
- move /y xxx.temp !fileName!.txt
- )
- )
- endlocal
- pause
复制代码
我太菜了..写了好多..并且有一个问题,如果一个标题在多个log内存在,会有异常,也算变相查重了吧,如果没需要,我再试试修改
作者: xp3000 时间: 2023-1-8 19:20
本帖最后由 xp3000 于 2023-1-11 12:20 编辑
谢谢,可以用就行,在两首诗同名时确实会出错
一个文本,两首同名不同内容的诗
作者: WHY 时间: 2023-1-8 23:33
本帖最后由 WHY 于 2023-1-8 23:39 编辑
- @echo off
- cd /d "%~dp0"
- for %%i in (*.txt) do (
- if exist "%%~ni.log" (
- setlocal enabledelayedexpansion
- for /f "delims=" %%j in ('type "%%~ni.log"') do (
- set "_%%j=1"
- )
- (for /f "delims=" %%j in ('type "%%i" ^| findstr /n .*') do (
- set "s=%%j"
- set "s=!s:*:=!"
- if defined _!s! (
- set /a n+=1
- echo;!n!、《!s!》
- set "_!s!="
- ) else (
- echo;!s!
- )
- )) > "%%i.~tmp"
- endlocal
- move "%%i.~tmp" "%%i"
- )
- )
- pause
复制代码
作者: xp3000 时间: 2023-1-9 08:45
谢谢各位帮忙,
确实标题重复的都不能处理.
文本.txt- 岳阳楼
- 春色醉巴陵,阑干落洞庭。
- 水吞三楚白,山接九疑青。
- 空阔鱼龙气,婵娟帝子灵。
- 何人夜吹笛,风急雨冥冥。
-
- 岳阳楼
- 岳阳楼
- 岳阳楼上日衔窗,影到深潭赤玉幢。
- 怅望残春万般意,满棂湖水入西江。
-
- 黄鹤楼
- 昔人已乘黄鹤去,此地空余黄鹤楼。
- 黄鹤一去不复返,白云千载空悠悠。
- 晴川历历汉阳树,芳草萋萋鹦鹉洲。
- 日暮乡关何处是,烟波江上使人愁。
复制代码
文本.log复制代码
这种情况,代码都出现了问题
作者: qixiaobin0715 时间: 2023-1-9 09:59
回复 7# xp3000
这样呢。所有文件必须保存为ANSI编码:- @echo off
- for /f "delims=" %%a in ('dir /b /a-d *.log') do (
- setlocal enabledelayedexpansion
- (for /f "delims=" %%i in ('type "%%a"') do (
- set _"%%i"=true
- )
- set n=0
- for /f "delims=" %%j in ('type "%%~na.txt"') do (
- if defined _"%%j" (
- set /a n+=1
- echo,!n!、 《%%j》
- set _"%%j"=
- ) else (
- echo,%%j
- )
- ))>New%%~na.txt
- endlocal
- )
- pause
复制代码
作者: xp3000 时间: 2023-1-9 10:13
处理后显示- 1、 《岳阳楼》
- 春色醉巴陵,阑干落洞庭。
- 水吞三楚白,山接九疑青。
- 空阔鱼龙气,婵娟帝子灵。
- 何人夜吹笛,风急雨冥冥。
- 岳阳楼
- 岳阳楼
- 岳阳楼上日衔窗,影到深潭赤玉幢。
- 怅望残春万般意,满棂湖水入西江。
- 2、 《黄鹤楼》
- 昔人已乘黄鹤去,此地空余黄鹤楼。
- 黄鹤一去不复返,白云千载空悠悠。
- 晴川历历汉阳树,芳草萋萋鹦鹉洲。
- 日暮乡关何处是,烟波江上使人愁。
复制代码
第二个岳阳楼重复两次,
第二次出现的需要在第一个出现时追加序号,
这里没实现,也就是下面结果,空行需要保留- 1、 《岳阳楼》
- 春色醉巴陵,阑干落洞庭。
- 水吞三楚白,山接九疑青。
- 空阔鱼龙气,婵娟帝子灵。
- 何人夜吹笛,风急雨冥冥。
-
- 2、 《岳阳楼》
- 岳阳楼
- 岳阳楼上日衔窗,影到深潭赤玉幢。
- 怅望残春万般意,满棂湖水入西江。
-
- 3、 《黄鹤楼》
- 昔人已乘黄鹤去,此地空余黄鹤楼。
- 黄鹤一去不复返,白云千载空悠悠。
- 晴川历历汉阳树,芳草萋萋鹦鹉洲。
- 日暮乡关何处是,烟波江上使人愁。
复制代码
作者: qixiaobin0715 时间: 2023-1-9 10:48
本帖最后由 qixiaobin0715 于 2023-1-9 10:56 编辑
回复 9# xp3000
理解有误,这样行否:- @echo off
- for /f "delims=" %%a in ('dir /b /a-d *.log') do (
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('type "%%a"') do (
- set _"%%i"=true
- )
- set n=1
- set m=1
- (for /f "tokens=1* delims=:" %%i in ('findstr /n .* "%%~na.txt"') do (
- if defined _"%%j" (
- if !m! equ 1 (
- echo,!n!、 《%%j》
- set /a n+=1
- ) else (
- echo,%%j
- )
- set m=2
- ) else (
- echo,%%j
- set m=1
- )
- ))>New%%~na.txt
- endlocal
- )
- pause
复制代码
作者: xp3000 时间: 2023-1-9 11:04
谢谢,这个可以
作者: WHY 时间: 2023-1-9 14:04
本帖最后由 WHY 于 2023-1-9 14:27 编辑
回复 9# xp3000
试试- @if(0)==(0) echo off
- cd /d "%~dp0"
- set "dstDir=Result"
- md "%dstDir%" 2>nul
- dir /b *.log | cscript //nologo //e:jscript "%~f0" "%dstDir%"
- pause & exit /b
- @end
-
- var dstDir = WSH.Arguments(0); //目标目录
- var fso = new ActiveXObject('Scripting.FileSystemObject');
-
- while( !WSH.StdIn.AtEndOfStream ){
- var file1 = WSH.StdIn.ReadLine(); //log文件名
- var file2 = file1.replace(/\.log$/i, '.txt'); //txt文件名
- if( !fso.FileExists(file2) ) continue; //判断txt文件是否存在
- var reg = getText(file1); //log文本用"|"拼接
- var f = fso.OpenTextFile(file2, 1);
- var str = f.ReadAll();
- f.Close();
- var i = 0;
- str = str.replace(
- new RegExp( '^(' + reg + ')((?:\\r?\\n|$)(?:\\1(?:\\r?\\n|$))*)', 'igm' ),
- function(s0, s1, s2){
- return '' + ++i + '、《' + s1 + '》' + s2;
- }
- )
- fso.OpenTextFile(dstDir + '\\' + file2, 2, true).Write(str); //保存
- }
-
- function getText(file){
- var f = fso.OpenTextFile(file, 1);
- var arr = [], map = [];
- while( !f.AtEndOfStream ){
- var s = f.ReadLine();
- if(/^\s*$/.test(s)) continue;
- if(!map.hasOwnProperty(s)){
- var s1 = s.replace(/[\\|.^$()[\]{}*?+-]/g, '\\$&'); //字符转义
- arr.push(s1);
- map[s] = true; //去重复
- }
- }
- f.Close();
- return arr.join('|');
- }
复制代码
作者: xp3000 时间: 2023-1-9 14:41
谢谢,学习了,可以用
作者: xp3000 时间: 2023-1-10 09:00
回复 2# hfxiang
如何修复两首诗同名,会异常的问题?
作者: WHY 时间: 2023-1-10 13:31
- @echo off
- cd /d "%~dp0"
- md "Result" 2>nul
- for %%i in (*.log) do (
- setlocal enabledelayedexpansion
- for /f "delims=" %%j in ('type "%%i"') do (
- set "_%%j=1"
- )
- (for /f "delims=" %%j in ('type "%%~ni.txt" ^| findstr /n .*') do (
- REM 当前行
- set "curStr=%%j"
- set "curStr=!curStr:*:=!"
- if defined _!curStr! (
- if "!curStr!" == "!preStr!" (
- echo;!curStr!
- ) else (
- set /a n+=1
- echo,!n!、《!curStr!》
- )
- ) else (
- echo;!curStr!
- )
- REM 上一行
- set "preStr=!curStr!"
- )) > "Result\%%~ni.txt"
- endlocal
- )
- pause
复制代码
- @echo off
- cd /d "%~dp0"
- md "Result" 2>nul
- for %%i in (*.log) do (
- gawk "NR==FNR{a[$0]=1}NR>FNR{if(a[$0]&&s!=$0){print ++i\"、《\"$0\"》\"}else print;s=$0}" "%%i" "%%~ni.txt" > "Result\%%~ni.txt"
- )
- pause
复制代码
作者: WHY 时间: 2023-1-10 13:34
本帖最后由 WHY 于 2023-1-13 20:45 编辑
- <# :
- @echo off
- md "%~dp0Result" 2>nul
- PowerShell -C ". ([ScriptBlock]::Create((gc -Literal '%~f0') -join \"`r`n\")) '%~dp0' '%~dp0Result'"
- pause & exit
- #>
-
- param($myPath, $dstPath);
-
- forEach( $file In (dir -Literal $myPath -Filter *.log) ){
- $logFile = $file.FullName; #log文件名
- $txtFile = $file.FullName -replace '\.log$', '.txt'; #txt文件名
- if( ![IO.File]::Exists($txtFile) ){ continue; } #判断txt文件是否存在
-
- $Hash = @{}
- $arr1 = gc -Literal $logFile -ReadCount 0; #log文本存入数组arr1
- for($i=0; $i -lt $arr1.Count; $i++){ #遍历数组arr1
- if($arr1[$i] -ne '' -and !$Hash.ContainsKey($arr1[$i])){ #删除空行、重复行
- $Hash.Add($arr1[$i], $true); #存入哈希表
- }
- }
-
- $arr2 = gc -Literal $txtFile -ReadCount 0; #txt文本存入数组arr2
- $n = 0;
- for($i=0; $i -lt $arr2.Count; $i++){ #遍历数组arr2
- $curStr = $arr2[$i]; #当前行
- if($Hash.ContainsKey($curStr) -and $curStr -ne $preStr){
- $arr2[$i] = '' + ++$n + '、《' + $curStr + '》';
- }
- $preStr = $curStr; #上一行
- }
-
- $dstFile = $dstPath + '\' + $file.BaseName + '.txt'; #目标文件名
- [IO.File]::WriteAllLines($dstFile, $arr2, [Text.Encoding]::Default); #保存
- }
复制代码
作者: xp3000 时间: 2023-1-10 13:39
谢谢大神,学习了
作者: hfxiang 时间: 2023-1-10 16:52
回复 14# xp3000
试试这个- gawk "NR==FNR{text[$0] = NR \"、《\" $0 \"》\";next}{if(A!=$0)if($0 in text){A=$0;$0=text[$0]}}1" 文本.log 文本.txt>修改后的文本.txt
复制代码
作者: terse 时间: 2023-1-10 17:52
- @echo off
- rem 所有文件存为ANSI编码
- for /f "delims=" %%f in ('dir /b *.log') do (
- setlocal enabledelayedexpansion
- for /f "usebackq tokens=*" %%i in ("%%f") do set ""%%i"=1"
- if exist "%%~nf.txt" (
- (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%%~nf.txt"') do (
- if defined "%%b" (
- if "!m!" == "!n!" (
- set/a n+=1,m=0
- echo;!n! 《%%b》
- ) else echo;%%b
-
- ) else echo;%%b&set m=!n!
- ))>"temp_%%f"
- ) else echo;%%f对应文件不存在
- endlocal
- )
- pause
复制代码
作者: xp3000 时间: 2023-1-11 12:18
回复 19# terse
谢谢,可以用
作者: xp3000 时间: 2023-1-11 12:24
回复 18# hfxiang
还是会出问题,像8楼一样
文本.txt- 岳阳楼
- 春色醉巴陵,阑干落洞庭。
- 水吞三楚白,山接九疑青。
- 空阔鱼龙气,婵娟帝子灵。
- 何人夜吹笛,风急雨冥冥。
-
- 岳阳楼
- 岳阳楼
- 岳阳楼上日衔窗,影到深潭赤玉幢。
- 怅望残春万般意,满棂湖水入西江。
-
- 黄鹤楼
- 昔人已乘黄鹤去,此地空余黄鹤楼。
- 黄鹤一去不复返,白云千载空悠悠。
- 晴川历历汉阳树,芳草萋萋鹦鹉洲。
- 日暮乡关何处是,烟波江上使人愁。
复制代码
文本.log复制代码
复制代码
这种情况,代码都出现了问题
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |