Board logo

标题: [文本处理] 批处理合并同类行内容 [打印本页]

作者: namejm    时间: 2008-7-29 08:52     标题: 批处理合并同类行内容

  在其他论坛闲逛的时候,发现了一个很有趣的问题,发出来也让大家练练手:
比如有2个 txt文件  一个是1.txt 一个是2.txt
1.txt 里面是:
47711        聚异网盟新丝路网吧        好
47710        仙踪林        差
47709        远东网络会所        差
47708        都市之光网吧        差
47707        E时代网吧        差
47706        网通家园        差
47705        欣网E家        中
47703        沙院光明网吧        差
47702        新东方网吧        差
47676        聚异网盟金程网吧        好
47675        扬州市红叶网吧        好

2.txt 里面是:

47715        天外天网吧        好
47713        新时代网吧4        好
47711        聚异网盟新丝路网吧        好
47710        仙踪林        好
47709        远东网络会所        好
47708        都市之光网吧        差
47707        E时代网吧        差
47706        网通家园        差
47705        欣网E家        中
47676        聚异网盟金程网吧        好
47675        扬州市红叶网吧        好

对比给的结果希望的是:
47715        天外天网吧        好
47713        新时代网吧4        好
47711        聚异网盟新丝路网吧        好好
47710        仙踪林        差好
47709        远东网络会所        差好
47708        都市之光网吧        差差
47707        E时代网吧        差差
47706        网通家园        差差
47705        欣网E家        中中
47703        沙院光明网吧        差
47702        新东方网吧        差
47676        聚异网盟金程网吧        好好
47675        扬州市红叶网吧        好好

  要求:按照序号降序排列(序号位数相同),把相同序号所在行的第三列合并,其他内容原样输出;没有相同序号的行原样输出。
作者: batman    时间: 2008-7-29 10:00

我可以做不?

[ 本帖最后由 batman 于 2008-7-29 13:13 编辑 ]
作者: namejm    时间: 2008-7-29 10:04

不是特意针对新手,各种水平的都可以拿来练手。
作者: batman    时间: 2008-7-29 13:05

先发个sort版的:
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%a in (1.txt 2.txt) do (
  3.     for /f "tokens=1-3" %%i in (%%a) do (
  4.         if defined _%%i (
  5.            set "_%%i=%%i        %%j        !.%%i!%%k"
  6.            ) else (
  7.            set "_%%i=%%i        %%j        %%k"&set ".%%i=%%k"
  8. )))
  9. for /f "tokens=1* delims==" %%i in ('set _') do echo %%j>>3.txt
  10. sort /r 3.txt&del /q 3.txt
  11. pause>nul
复制代码

[ 本帖最后由 batman 于 2008-7-29 13:07 编辑 ]
作者: namejm    时间: 2008-7-29 20:32

  楼上的代码效率很高,不错不错。美中不足的就是变量用得太多了,应该尽量避免。帖个我写的代码吧:
  1. @echo off
  2. copy 1.txt 3.txt>nul
  3. (echo.&type 2.txt)>>3.txt
  4. setlocal enabledelayedexpansion
  5. for /f "tokens=1-3" %%i in ('sort /r 3.txt') do (
  6.     if "%%i"=="!str!" (
  7.         set /p=%%k<nul
  8.     ) else (
  9.         echo.&set /p=%%i %%j %%k<nul
  10.     )
  11.     set str=%%i
  12. )
  13. echo.
  14. pause
复制代码

作者: batman    时间: 2008-7-30 00:21

再来个no sort no tempfile的:
  1. @echo off&setlocal enabledelayedexpansion
  2. set "min=0"&set "max=0"
  3. for %%a in (1.txt 2.txt) do (
  4.     for /f "tokens=1-3" %%i in (%%a) do (
  5.     set /a n+=1
  6.         if !max! lss %%i set "max=%%i"
  7.         if !min! gtr %%i set "min=%%i"
  8.         if defined _%%i (
  9.            set "_%%i=%%i        %%j        !.%%i!%%k"&set /a n-=1
  10.            ) else (
  11.            set "_%%i=%%i        %%j        %%k"&set ".%%i=%%k"
  12. )))
  13. for /l %%i in (%max%,-1,%min%) do if defined _%%i echo !_%%i!
  14. pause>nul
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2