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

[文本处理] 批处理合并同类行内容

  在其他论坛闲逛的时候,发现了一个很有趣的问题,发出来也让大家练练手:
比如有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        扬州市红叶网吧        好好

  要求:按照序号降序排列(序号位数相同),把相同序号所在行的第三列合并,其他内容原样输出;没有相同序号的行原样输出。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

再来个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
复制代码
***共同提高***

TOP

  楼上的代码效率很高,不错不错。美中不足的就是变量用得太多了,应该尽量避免。帖个我写的代码吧:
  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
复制代码
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

先发个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 编辑 ]
***共同提高***

TOP

不是特意针对新手,各种水平的都可以拿来练手。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

我可以做不?

[ 本帖最后由 batman 于 2008-7-29 13:13 编辑 ]
***共同提高***

TOP

返回列表