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

[文本处理] [已解决]批处理对比两个文本,如何给一个文本添加一次顺序序号?

文本.txt对应文本.log
文本2.txt对应文本2.log
文本3.txt对应文本3.log
文本4.txt对应文本4.log


文本.txt:
  1. 送胡大
  2.   荆门不堪别,况乃潇湘秋。
  3.   何处遥望君,江边明月楼。
  4. 送狄宗亨
  5.   秋在水清山暮蝉,洛阳树色鸣皋烟。
  6.   送君归去愁不尽,又惜空度凉风天。
  7. 送窦七
  8.   清江月色傍林秋,波上荧荧望一舟。
  9.   鄂渚轻帆须早发,江边明月为君留。
  10. 送柴侍御
  11.   沅水通波接武冈,送君不觉有离伤。
  12.   青山一道同云雨,明月何曾是两乡?
  13. 送郭司仓
  14.   映门淮水绿,留骑主人心。
  15.   明月随良掾,春潮夜夜深。
  16. 送任五之桂林
  17.   楚客醉孤舟,越水将引掉。
  18.   山为两乡别,月带千里貌。
  19.   羁谴同缯纶,僻幽闻虎豹。
  20.   桂林寒色在,苦节知所效。
  21. 送李十五
  22.   怨别秦楚深,江中秋云起。
  23.   天长杳无隔,月影在寒水。
  24. 送张四
  25.   枫林已愁暮,楚水复堪悲。
  26.   别后冷山月,清猿无断时。
  27. 芙蓉楼送辛渐
  28.   寒雨连江夜入吴,平明送客楚山孤。
  29.   洛阳亲友如相问,一片冰心在玉壶。
复制代码
文本.log:
  1. 送胡大
  2. 送狄宗亨
  3. 送窦七
  4. 送柴侍御
  5. 送郭司仓
  6. 送任五之桂林
  7. 送李十五
  8. 送张四
  9. 芙蓉楼送辛渐
复制代码
读取文本.log后,查找文本.txt,将当内容相同时,便在前面添加一个序号和《》,变成:
  1. 1、 《送胡大》
  2.   荆门不堪别,况乃潇湘秋。
  3.   何处遥望君,江边明月楼。
  4. 2、 《送狄宗亨》
  5.   秋在水清山暮蝉,洛阳树色鸣皋烟。
  6.   送君归去愁不尽,又惜空度凉风天。
  7. 3、 《送窦七》
  8.   清江月色傍林秋,波上荧荧望一舟。
  9.   鄂渚轻帆须早发,江边明月为君留。
  10. 4、 《送柴侍御》
  11.   沅水通波接武冈,送君不觉有离伤。
  12.   青山一道同云雨,明月何曾是两乡?
  13. 5、 《送郭司仓》
  14.   映门淮水绿,留骑主人心。
  15.   明月随良掾,春潮夜夜深。
  16. 6、 《送任五之桂林》
  17.   楚客醉孤舟,越水将引掉。
  18.   山为两乡别,月带千里貌。
  19.   羁谴同缯纶,僻幽闻虎豹。
  20.   桂林寒色在,苦节知所效。
  21. 7、 《送李十五》
  22.   怨别秦楚深,江中秋云起。
  23.   天长杳无隔,月影在寒水。
  24. 8、 《送张四》
  25.   枫林已愁暮,楚水复堪悲。
  26.   别后冷山月,清猿无断时。
  27. 9、 《芙蓉楼送辛渐》
  28.   寒雨连江夜入吴,平明送客楚山孤。
  29.   洛阳亲友如相问,一片冰心在玉壶。
复制代码
只添加一次,如果碰到重复的,只在首个出现的前面添加序号,
比如文本.txt
送张四是8、 《送张四》,
芙蓉楼送辛渐是9、 《芙蓉楼送辛渐》,
如果碰到
  1. 送张四
  2.   枫林已愁暮,楚水复堪悲。
  3.   别后冷山月,清猿无断时。
  4. 芙蓉楼
  5. 芙蓉楼送辛渐
  6. 芙蓉楼送辛渐
  7.   寒雨连江夜入吴,平明送客楚山孤。
  8.   洛阳亲友如相问,一片冰心在玉壶。
复制代码
替换为:
  1. 8、 《送张四》
  2.   枫林已愁暮,楚水复堪悲。
  3.   别后冷山月,清猿无断时。
  4. 芙蓉楼
  5. 9、 《芙蓉楼送辛渐》
  6. 芙蓉楼送辛渐
  7.   寒雨连江夜入吴,平明送客楚山孤。
  8.   洛阳亲友如相问,一片冰心在玉壶。
复制代码

如不介意,可用第3方工具gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe )来实现
  1. gawk "NR==FNR{text[$0] = NR \"、《\" $0 \"》\";next}{if($0 in text){$0=text[$0]}}1" 文本.log 文本.txt>修改后的文本.txt
复制代码
注意,要确保“文本.log” 及 “文本.txt” 已保存为ANSI编码格式
1

评分人数

TOP

本帖最后由 xp3000 于 2023-1-10 13:44 编辑

谢谢,如果碰到两首诗同名会出错,怎么修改

TOP

本帖最后由 77七 于 2023-1-8 14:21 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  4.         set "fileName=%%~ni"
  5.         if exist "!fileName!.log" (
  6.                 for /f "delims=" %%a in (!fileName!.log) do (
  7.                         set "_%%a=ture"
  8.                 )
  9.                 set /a "num=0"
  10.                 for /f "delims=" %%b in ('findstr /n .* !fileName!.txt') do (
  11.                         set "str=%%b"
  12.                         set "str=!str:*:=!"
  13.                         if defined _!str! (
  14.                                 if defined #!str! (
  15.                                         >>xxx.temp echo,!str!
  16.                                 ) else (
  17.                                         set /a num=num+1
  18.                                         set "#!str!=ture"
  19.                                         >>xxx.temp echo,!num!、 《!str!》
  20.                                 )
  21.                         ) else (
  22.                                 >>xxx.temp echo,!str!
  23.                         )
  24.                 )
  25.                 move /y xxx.temp !fileName!.txt
  26.         )
  27. )
  28. endlocal
  29. pause
复制代码

我太菜了..写了好多..并且有一个问题,如果一个标题在多个log内存在,会有异常,也算变相查重了吧,如果没需要,我再试试修改
1

评分人数

bat小白,请多指教!谢谢!

TOP

本帖最后由 xp3000 于 2023-1-11 12:20 编辑

谢谢,可以用就行,在两首诗同名时确实会出错

一个文本,两首同名不同内容的诗

TOP

本帖最后由 WHY 于 2023-1-8 23:39 编辑
  1. @echo off
  2. cd /d "%~dp0"
  3. for %%i in (*.txt) do (
  4.     if exist "%%~ni.log" (
  5.         setlocal enabledelayedexpansion
  6.         for /f "delims=" %%j in ('type "%%~ni.log"') do (
  7.             set "_%%j=1"
  8.         )
  9.         (for /f "delims=" %%j in ('type "%%i" ^| findstr /n .*') do (
  10.             set "s=%%j"
  11.             set "s=!s:*:=!"
  12.             if defined _!s! (
  13.                 set /a n+=1
  14.                 echo;!n!、《!s!》
  15.                 set "_!s!="
  16.             ) else (
  17.                 echo;!s!
  18.             )
  19.         )) > "%%i.~tmp"
  20.         endlocal
  21.         move "%%i.~tmp" "%%i"
  22.     )
  23. )
  24. pause
复制代码
1

评分人数

TOP

谢谢各位帮忙,
确实标题重复的都不能处理.
文本.txt
  1. 岳阳楼
  2. 春色醉巴陵,阑干落洞庭。
  3. 水吞三楚白,山接九疑青。
  4. 空阔鱼龙气,婵娟帝子灵。
  5. 何人夜吹笛,风急雨冥冥。
  6. 岳阳楼
  7. 岳阳楼
  8. 岳阳楼上日衔窗,影到深潭赤玉幢。
  9. 怅望残春万般意,满棂湖水入西江。
  10. 黄鹤楼
  11.   昔人已乘黄鹤去,此地空余黄鹤楼。
  12.   黄鹤一去不复返,白云千载空悠悠。
  13.   晴川历历汉阳树,芳草萋萋鹦鹉洲。
  14.   日暮乡关何处是,烟波江上使人愁。
复制代码
文本.log
  1. 岳阳楼
  2. 黄鹤楼
  3. 岳阳楼
复制代码
这种情况,代码都出现了问题

TOP

回复 7# xp3000
这样呢。所有文件必须保存为ANSI编码:
  1. @echo off
  2. for /f "delims=" %%a in ('dir /b /a-d *.log') do (
  3.     setlocal enabledelayedexpansion
  4.     (for /f "delims=" %%i in ('type "%%a"') do (
  5.         set _"%%i"=true
  6.     )
  7.     set n=0
  8.     for /f "delims=" %%j in ('type "%%~na.txt"') do (
  9.         if defined _"%%j" (
  10.             set /a n+=1
  11.             echo,!n!、 《%%j》
  12.             set _"%%j"=
  13.         ) else (
  14.             echo,%%j
  15.         )
  16.     ))>New%%~na.txt
  17.     endlocal
  18. )
  19. pause
复制代码
1

评分人数

TOP

处理后显示
  1. 1、 《岳阳楼》
  2. 春色醉巴陵,阑干落洞庭。
  3. 水吞三楚白,山接九疑青。
  4. 空阔鱼龙气,婵娟帝子灵。
  5. 何人夜吹笛,风急雨冥冥。
  6. 岳阳楼
  7. 岳阳楼
  8. 岳阳楼上日衔窗,影到深潭赤玉幢。
  9. 怅望残春万般意,满棂湖水入西江。
  10. 2、 《黄鹤楼》
  11.   昔人已乘黄鹤去,此地空余黄鹤楼。
  12.   黄鹤一去不复返,白云千载空悠悠。
  13.   晴川历历汉阳树,芳草萋萋鹦鹉洲。
  14.   日暮乡关何处是,烟波江上使人愁。
复制代码
第二个岳阳楼重复两次,
第二次出现的需要在第一个出现时追加序号,
这里没实现,也就是下面结果,空行需要保留
  1. 1、 《岳阳楼》
  2. 春色醉巴陵,阑干落洞庭。
  3. 水吞三楚白,山接九疑青。
  4. 空阔鱼龙气,婵娟帝子灵。
  5. 何人夜吹笛,风急雨冥冥。
  6. 2、 《岳阳楼》
  7. 岳阳楼
  8. 岳阳楼上日衔窗,影到深潭赤玉幢。
  9. 怅望残春万般意,满棂湖水入西江。
  10. 3、 《黄鹤楼》
  11.   昔人已乘黄鹤去,此地空余黄鹤楼。
  12.   黄鹤一去不复返,白云千载空悠悠。
  13.   晴川历历汉阳树,芳草萋萋鹦鹉洲。
  14.   日暮乡关何处是,烟波江上使人愁。
复制代码

TOP

本帖最后由 qixiaobin0715 于 2023-1-9 10:56 编辑

回复 9# xp3000
理解有误,这样行否:
  1. @echo off
  2. for /f "delims=" %%a in ('dir /b /a-d *.log') do (
  3.     setlocal enabledelayedexpansion
  4.     for /f "delims=" %%i in ('type "%%a"') do (
  5.         set _"%%i"=true
  6.     )
  7.     set n=1
  8.     set m=1
  9.     (for /f "tokens=1* delims=:" %%i in ('findstr /n .* "%%~na.txt"') do (
  10.         if defined _"%%j" (
  11.             if !m! equ 1 (
  12.                 echo,!n!、 《%%j》
  13.                 set /a n+=1
  14.             ) else (
  15.                 echo,%%j
  16.             )
  17.             set m=2
  18.         ) else (
  19.             echo,%%j
  20.             set m=1
  21.         )
  22.     ))>New%%~na.txt
  23.     endlocal
  24. )
  25. pause
复制代码
1

评分人数

TOP

谢谢,这个可以

TOP

本帖最后由 WHY 于 2023-1-9 14:27 编辑

回复 9# xp3000


    试试
  1. @if(0)==(0) echo off
  2. cd /d "%~dp0"
  3. set "dstDir=Result"
  4. md "%dstDir%" 2>nul
  5. dir /b *.log | cscript //nologo //e:jscript "%~f0" "%dstDir%"
  6. pause & exit /b
  7. @end
  8. var dstDir = WSH.Arguments(0);                      //目标目录
  9. var fso = new ActiveXObject('Scripting.FileSystemObject');
  10. while( !WSH.StdIn.AtEndOfStream ){
  11.     var file1 = WSH.StdIn.ReadLine();               //log文件名
  12.     var file2 = file1.replace(/\.log$/i, '.txt');   //txt文件名
  13.     if( !fso.FileExists(file2) ) continue;          //判断txt文件是否存在
  14.     var reg = getText(file1);                       //log文本用"|"拼接
  15.     var f = fso.OpenTextFile(file2, 1);
  16.     var str = f.ReadAll();
  17.     f.Close();
  18.     var i = 0;
  19.     str = str.replace(
  20.         new RegExp( '^(' + reg + ')((?:\\r?\\n|$)(?:\\1(?:\\r?\\n|$))*)', 'igm' ),
  21.         function(s0, s1, s2){
  22.             return '' + ++i + '、《' + s1 + '》' + s2;
  23.         }
  24.     )
  25.     fso.OpenTextFile(dstDir + '\\' + file2, 2, true).Write(str);    //保存
  26. }
  27. function getText(file){
  28.     var f = fso.OpenTextFile(file, 1);
  29.     var arr = [], map = [];
  30.     while( !f.AtEndOfStream ){
  31.         var s = f.ReadLine();
  32.         if(/^\s*$/.test(s)) continue;
  33.         if(!map.hasOwnProperty(s)){
  34.             var s1 = s.replace(/[\\|.^$()[\]{}*?+-]/g, '\\$&'); //字符转义
  35.             arr.push(s1);
  36.             map[s] = true;  //去重复
  37.         }
  38.     }
  39.     f.Close();
  40.     return arr.join('|');
  41. }
复制代码
1

评分人数

TOP

谢谢,学习了,可以用

TOP

回复 2# hfxiang

如何修复两首诗同名,会异常的问题?

TOP

  1. @echo off
  2. cd /d "%~dp0"
  3. md "Result" 2>nul
  4. for %%i in (*.log) do (
  5.     setlocal enabledelayedexpansion
  6.     for /f "delims=" %%j in ('type "%%i"') do (
  7.         set "_%%j=1"
  8.     )
  9.     (for /f "delims=" %%j in ('type "%%~ni.txt" ^| findstr /n .*') do (
  10.         REM 当前行
  11.         set "curStr=%%j"
  12.         set "curStr=!curStr:*:=!"
  13.         if defined _!curStr! (
  14.             if "!curStr!" == "!preStr!" (
  15.                 echo;!curStr!
  16.             ) else (
  17.                 set /a n+=1
  18.                 echo,!n!、《!curStr!》
  19.             )
  20.         ) else (
  21.             echo;!curStr!
  22.         )
  23.         REM 上一行
  24.         set "preStr=!curStr!"
  25.     )) > "Result\%%~ni.txt"
  26.     endlocal
  27. )
  28. pause
复制代码
  1. @echo off
  2. cd /d "%~dp0"
  3. md "Result" 2>nul
  4. for %%i in (*.log) do (
  5.     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"
  6. )
  7. pause
复制代码
1

评分人数

TOP

返回列表