标题: [文本处理] 批处理合并同类行内容 [打印本页]
作者: 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版的:- @echo off&setlocal enabledelayedexpansion
- for %%a in (1.txt 2.txt) do (
- for /f "tokens=1-3" %%i in (%%a) do (
- if defined _%%i (
- set "_%%i=%%i %%j !.%%i!%%k"
- ) else (
- set "_%%i=%%i %%j %%k"&set ".%%i=%%k"
- )))
- for /f "tokens=1* delims==" %%i in ('set _') do echo %%j>>3.txt
- sort /r 3.txt&del /q 3.txt
- pause>nul
复制代码
[ 本帖最后由 batman 于 2008-7-29 13:07 编辑 ]
作者: namejm 时间: 2008-7-29 20:32
楼上的代码效率很高,不错不错。美中不足的就是变量用得太多了,应该尽量避免。帖个我写的代码吧:- @echo off
- copy 1.txt 3.txt>nul
- (echo.&type 2.txt)>>3.txt
- setlocal enabledelayedexpansion
- for /f "tokens=1-3" %%i in ('sort /r 3.txt') do (
- if "%%i"=="!str!" (
- set /p=%%k<nul
- ) else (
- echo.&set /p=%%i %%j %%k<nul
- )
- set str=%%i
- )
- echo.
- pause
复制代码
作者: batman 时间: 2008-7-30 00:21
再来个no sort no tempfile的:- @echo off&setlocal enabledelayedexpansion
- set "min=0"&set "max=0"
- for %%a in (1.txt 2.txt) do (
- for /f "tokens=1-3" %%i in (%%a) do (
- set /a n+=1
- if !max! lss %%i set "max=%%i"
- if !min! gtr %%i set "min=%%i"
- if defined _%%i (
- set "_%%i=%%i %%j !.%%i!%%k"&set /a n-=1
- ) else (
- set "_%%i=%%i %%j %%k"&set ".%%i=%%k"
- )))
- for /l %%i in (%max%,-1,%min%) do if defined _%%i echo !_%%i!
- pause>nul
复制代码
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |