[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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.   洛阳亲友如相问,一片冰心在玉壶。
复制代码

回复 18# hfxiang

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

TOP

回复 19# terse
谢谢,可以用

TOP

  1. @echo off
  2. rem 所有文件存为ANSI编码
  3. for /f "delims=" %%f in ('dir /b *.log') do (
  4.      setlocal enabledelayedexpansion
  5.      for /f "usebackq tokens=*" %%i in ("%%f") do set ""%%i"=1"
  6.      if exist "%%~nf.txt" (
  7.           (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%%~nf.txt"') do (
  8.                if defined "%%b" (
  9.                     if "!m!" == "!n!" (
  10.                          set/a n+=1,m=0
  11.                          echo;!n! 《%%b》
  12.                     ) else echo;%%b
  13.                )  else echo;%%b&set m=!n!
  14.           ))>"temp_%%f"
  15.      ) else echo;%%f对应文件不存在
  16.      endlocal
  17. )
  18. pause
复制代码
1

评分人数

TOP

回复 14# xp3000


    试试这个
  1. gawk "NR==FNR{text[$0] = NR \"、《\" $0 \"》\";next}{if(A!=$0)if($0 in text){A=$0;$0=text[$0]}}1" 文本.log 文本.txt>修改后的文本.txt
复制代码
1

评分人数

TOP

谢谢大神,学习了

TOP

本帖最后由 WHY 于 2023-1-13 20:45 编辑
  1. <# :
  2. @echo off
  3. md "%~dp0Result" 2>nul
  4. PowerShell -C ". ([ScriptBlock]::Create((gc -Literal '%~f0') -join \"`r`n\")) '%~dp0' '%~dp0Result'"
  5. pause & exit
  6. #>
  7. param($myPath, $dstPath);
  8. forEach( $file In (dir -Literal $myPath -Filter *.log) ){
  9.     $logFile = $file.FullName;                             #log文件名
  10.     $txtFile = $file.FullName -replace '\.log$', '.txt';   #txt文件名
  11.     if( ![IO.File]::Exists($txtFile) ){ continue; }        #判断txt文件是否存在
  12.     $Hash = @{}
  13.     $arr1 = gc -Literal $logFile -ReadCount 0;             #log文本存入数组arr1
  14.     for($i=0; $i -lt $arr1.Count; $i++){                   #遍历数组arr1
  15.         if($arr1[$i] -ne '' -and !$Hash.ContainsKey($arr1[$i])){  #删除空行、重复行
  16.             $Hash.Add($arr1[$i], $true);                   #存入哈希表
  17.         }
  18.     }
  19.         
  20.     $arr2 = gc -Literal $txtFile -ReadCount 0;             #txt文本存入数组arr2
  21.     $n = 0;
  22.     for($i=0; $i -lt $arr2.Count; $i++){                   #遍历数组arr2
  23.         $curStr = $arr2[$i];                               #当前行
  24.         if($Hash.ContainsKey($curStr) -and $curStr -ne $preStr){
  25.             $arr2[$i] = '' + ++$n + '、《' + $curStr + '》';
  26.         }
  27.         $preStr = $curStr;                                 #上一行
  28.     }
  29.     $dstFile = $dstPath + '\' + $file.BaseName + '.txt';   #目标文件名
  30.     [IO.File]::WriteAllLines($dstFile, $arr2, [Text.Encoding]::Default); #保存
  31. }
复制代码
1

评分人数

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

回复 2# hfxiang

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

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

本帖最后由 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

处理后显示
  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

回复 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

返回列表