中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 如何用批实现TXT文本的某两行互换?
« [1] [2] »
作者:
标题: 如何用批实现TXT文本的某两行互换? 上一主题 | 下一主题
lotus516
高级用户

论坛上抢劫的


积分 551
发帖 246
注册 2006-9-21
状态 离线
『楼 主』:  如何用批实现TXT文本的某两行互换?

我有一个文本,里面内容如下:
张三
李四
王二麻子
小白
小黑
小强
......    rem:中间为N行
小二
赵大
QQ
DOS
WIN98
WINXP
现在我想实现把WINXP和张三互换成如下文本:(即文本第一行和最后一行互换)
WINXP
李四
王二麻子
小白
小黑
小强
......        rem:中间为N行
小二
赵大
QQ
DOS
WIN98
张三

2006-11-6 03:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 2 楼』:  

只按楼主给出的原始模型处理,
以下代码只考虑到楼主上面非真实模型上的要求,
不考虑楼主没有给出的特殊情况或特殊符号等问题~:)
@echo %dbg% off
setlocal enabledelayedexpansion
if [%4]==[] goto :error
if exist %4 del /q %4

for /F "delims=" %%. in (%1) do (set /a line+=1 && set "num!line!=%%.")
(set swapTemp=!num%3!) && (set num%3=!num%2!) && (set num%2=!swapTemp!)
for /L %%i in (1,1,!line!) do (echo !num%%i!>>%4)
start %4
goto :eof

:error
        echo.
        echo 使用说明:%0.Bat  要处理的文件名  交换行数   被交换行数  交换后文件名
        echo.
        echo 例(A):%0.Bat swap.dat  5 10 a.txt
        echo        处理swap.dat文件,第5行与第10行数据交换,生成新文件:a.txt
        echo.
使用说明: 如果未加参数则提示使用说明信息。
使用说明: Swap.BAT  要处理的文件名  交换行数   被交换行数  交换后文件名

       
   例: Swap.BAT    swap.dat    5    10    a.txt
  表示: 处理 swap.dat 文件,第5行与第10行数据交换,生成新文件:a.txt
      Swap.BAT 文件为这个处理交换数据的批处理文件名,楼主可以任意起。
原理: 大老婆和二老婆想互相交换她们手中的礼物,
    于是大老婆先把礼物暂存在我这里,手腾空了后把二老婆的礼物拿了过去。
    二老婆的礼物交给了大老婆以后,手腾空了。这时我再把大老婆暂存在我手中的礼物交给二老婆。
    于是她们双方都互换了礼物~:)


[备注:] 指定生成的新文件如果是已存在的文件,它将自动无提示删除。

[ Last edited by redtek on 2006-11-6 at 05:50 AM ]



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-11-6 05:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 3 楼』:  

  假设你要处理的test.txt文本中没有CMD下的敏感字符(如<、>、|等),首行不为空,并且没有内容重复的行,那么,用下面的代码基本能满足你的需求:
@echo off
:: 思路:
::     提取第一行和最后一行内容(若最后一行是空行,则提取到的是非空的最后一行内容),
:: 然后在新文本的首行写入提取到的最后一行,用 findstr 语句过滤掉原文本的第一行和最后一行,在最后一行
:: 之后添加提取到的第一行。
:: 因为 findstr 处理最后一行有条件限制,所以先在最后一行之后生成一个空行,以保证提取的准确性
copy test.txt test.bak>nul
echo.>>test.txt
set num=0
setlocal enabledelayedexpansion
for /f "delims=" %%i in (test.txt) do (
    set str=%%i
    set /a num+=1
    if !num! equ 1 set var=%%i
)
>test_.txt echo.%str%
findstr /b /e /v /c:"%str%" /c:"%var%" test.txt>>test_.txt
>>test_.txt echo.%var%
move test.bak test.txt
start test_.txt
[ Last edited by namejm on 2006-11-6 at 02:03 PM ]

   此帖被 +2 点积分     点击查看详情   
评分人:【 redtek 分数: +2  时间:2006-11-7 09:27




尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-11-6 05:55
查看资料  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 4 楼』:  

本来应该为方便楼主应用,
例如:想让第3行与倒数第3行交换,则

   Swap.BAT    swap.dat    3   -3    a.txt
 或 Swap.BAT    swap.dat    3   a.txt

如果能这样会更方便楼主,实在是力不从心,谅~~



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-11-6 05:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 5 楼』:  

  在3F的基础上得到如下代码,可以处理内容有重复的行。原理和3F近似,只是过滤的不再是行内容,而是过滤行号:
@echo off
:: 注意:因为 findstr /n 统计行数的时候,会忽略最后一个空行
:: 所以,若在最后有空行的话,请保证空行的个数大于1
findstr /n .* test.txt>tmp1.txt
for /f "tokens=1* delims=:" %%i in (tmp1.txt) do (
    if %%i equ 1 set str=%%j
    set line=%%i&set var=%%j
)
>tmp2.txt echo %line%:%var%
findstr /b /v /c:"1:" /c:"%line%:" tmp1.txt>>tmp2.txt
echo 1:%str%>>tmp2.txt
echo.>>tmp2.txt
cd.>result.txt
for /f "tokens=1* delims=:" %%i in (tmp2.txt) do >>result.txt echo.%%j
del /q tmp1.txt tmp2.txt
start result.txt




尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-11-6 07:06
查看资料  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 6 楼』:  

sed -n "$p" >temp.txt
sed "1{d;p}" test.txt |sed "${d;p}" >>temp.txt
sed -n "1p" >>temp.txt

未测试,原理上可行

2006-11-6 07:31
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
lotus516
高级用户

论坛上抢劫的


积分 551
发帖 246
注册 2006-9-21
状态 离线
『第 7 楼』:  

谢谢,不过namejm,3楼的命令不成功!!!

2006-11-6 11:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 8 楼』:  

  3F的代码有诸多限制,如果我说漏了某些情况,能否把你的txt内容贴一部分出来?



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-11-6 12:33
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lotus516
高级用户

论坛上抢劫的


积分 551
发帖 246
注册 2006-9-21
状态 离线
『第 9 楼』:  

好,详细见附件

附件 1: 1.txt (2006-11-7 01:48, 2.39 K, 下载附件所需积分 1 点 ,下载次数: 19)
2006-11-7 01:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 10 楼』:  

  不好意思,发帖子的时候,copy了修改前的代码,而没有帖出修正后的内容,导致3F的代码漏掉了写入首行和尾行的语句,现已修正,请再次测试。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-11-7 01:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 11 楼』:  

test.bat
@echo off
::%1为life,调换%2和%3
::比如说在test.txt中调换1行和9行,使用方法test.bat test.txt,1,9
::暂时不能换3,-3之类的,不过可以sed -n "$=" %1 来看总共有多少行~再set/a计算实际的+行数

if *%1==* (echo 未指定文件&pause>nul&goto :eof)
if *%2==* (set s=1) else (set s=%2)
if *%3==* (set e=$) else (set e=%3)
if not "%e%"=="$" if %e% lss %s% (set "s=%3"&set "e=%2")

for /f "tokens=*" %%? in ('sed -n "%e%p" %1') do (
                       sed -e "%s%h" -e "%e%x" %1|sed "%s% c\%%?" |more>temp.txt
                                                  )
pause
exit



测试test.txt
`-=[]\;',./~!@#o^&*()_+{}|:"<>?
ab
AB
12 34
一二三四五六七八九○
!·¥……—()——:“?》《
http ://abc.abc.abc/

[ Last edited by vkill on 2006-11-7 at 09:55 AM ]

2006-11-7 09:07
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 12 楼』:  

  网吧里的系统一般都是被阉割过的,有安全问题的命令可能都被废了。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-11-7 09:23
查看资料  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 13 楼』:  



  Quote:
Originally posted by namejm at 2006-11-7 09:23:
  网吧里的系统一般都是被阉割过的,有安全问题的命令可能都被废了。

namejm兄测试下,原理是先把9替换为1,再把1复制为原文件9的内容~

11 F代码更新

[ Last edited by vkill on 2006-11-7 at 09:58 AM ]

2006-11-7 09:31
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 14 楼』:  

  居然没有保存 sed 程序,我知道无奈何兄最近刚发过,但一时也搜索不到它的下载,汗~~,能给个下载的地址吗?



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-11-7 10:24
查看资料  发短消息 网志   编辑帖子  回复  引用回复
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 15 楼』:  

我也补个 sed 的,文件不要过于巨大。
sed -re :a -e "N;$!ba;s/([^\n]*)\n(.*)\n(.*)/\3\n\2\n\1/"
sed 下载:http://www.student.northpark.edu/pemente/sed/gsed407x.zip



  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

2006-11-7 11:09
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: