找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 76230|回复: 19

[文本处理] [已解决]如何将txt文本第2行移动插入到第4行和第5行之间?

[复制链接]
发表于 2016-3-30 00:31:59 | 显示全部楼层 |阅读模式
本帖最后由 pcl_test 于 2016-11-24 17:44 编辑

很多txt文件,需要将第2行移动到第4行和第5行之间,如某txt内容:
111111
222222
333333
444444
555555
……
操作后成为:
111111
333333
444444
222222
555555
……
好复杂啊,难死阿菜我了,大侠救命啊
发表于 2016-3-30 02:12:52 | 显示全部楼层

  1. set a1=0
  2. for /f "delims=*" %%z in  (123.txt) do (
  3.    set /a a1+=1
  4.    if not "%a1%"=="2" (echo.%%z >>tmp.txt) else (
  5.    set a2=%%z
  6.    )
  7. if "%a1%"=="4" echo.%a2% >>tmp.txt
  8. )
  9. del /s/q 123.txt
  10. ren tmp.txt 123.txt
复制代码
发表于 2016-3-30 08:32:52 | 显示全部楼层
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir /b *.txt') do (
  3.     (for %%j in (1 2 3 4) do set /p _%%j=)<"%%i"
  4.     for %%j in (1 3 4 2) do echo;!_%%j!&set "_%%j="
  5.     more +4 "%%i"
  6. )>"%%i.Log"
  7. pause
复制代码
发表于 2016-3-30 09:14:07 | 显示全部楼层
  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  3.     gawk "{if(NR==2)s=$0;else if(NR==4)print$0"\n"s;else print}" "%%i" > "%%~ni_new.txt"
  4. )
复制代码

评分

参与人数 1技术 +1 收起 理由
wzf1024 + 1 感谢分享,可以扩展

查看全部评分

发表于 2016-3-30 12:15:07 | 显示全部楼层
本帖最后由 happy886rr 于 2016-3-30 15:02 编辑

回复 1# wzf1024 跟你上次提的问题一个样,还得用pcl大的方法,照猫画虎

  1. @echo off&for /f "delims=" %%T in ('dir /a-d /b /s *.txt') do ((setlocal enabledelayedexpansion &set/pa=&echo;!a!&set/pb=&set/pc=&echo;!c!&set/pd=&echo;!d!&echo;!b!&endlocal &more +4)<"%%T">tmp &move tmp "%%T")
复制代码
 楼主| 发表于 2016-3-30 14:54:46 | 显示全部楼层
回复 2# qq692172929


    没有效果
 楼主| 发表于 2016-3-30 15:00:46 | 显示全部楼层
WHY和happy886rr大大的代码可以操作,但很局限,不能扩展,要是把999行移动到1999行和2000行之间就很麻烦。gawk大大的代码是相比之下的最好的。但还是感谢各位共享代码的大大,感谢你们的帮助,你们都很热心
 楼主| 发表于 2016-3-30 15:01:41 | 显示全部楼层
本帖最后由 wzf1024 于 2016-3-30 15:22 编辑

回复 4# gawk


    大侠,弱弱问一句,怎么扩展到子文件夹?
还有,如果子文件夹存在同名文件捏?
最好文件在原位置,不要移动
发表于 2016-3-30 15:04:52 | 显示全部楼层
回复 8# wzf1024
能扩展呀,你把4可以改为任意行都可以。前面在加一句more
 楼主| 发表于 2016-3-30 15:17:08 | 显示全部楼层
回复 9# happy886rr

移动第2行到第4行和第5行之间要这样abcd:
    &set/pa=&echo;!a!&set/pb=&set/pc=&echo;!c!&set/pd=&echo;!d!&echo;!b!
那要移动第999行到1999行和2000行之间要abcdefghijklmn…………………………?
发表于 2016-3-31 09:16:38 | 显示全部楼层
回复 8# wzf1024
  1. @echo off
  2. set path=%~dp0;%path%
  3. for /f "delims=" %%i in ('dir /b /s /a-d *.txt') do (
  4.     pushd "%%~dpi"
  5.     gawk "{if(NR==2)s=$0;else if(NR==4)print$0"\n"s;else print}" "%%i" > "%%~ni_new.txt"
  6.     popd
  7. )
复制代码
发表于 2016-3-31 10:18:46 | 显示全部楼层
回复 7# wzf1024


    你不会“扩展”并不代表代码真的“不能扩展”。

既然有这种需求,为何不在顶楼交代代清楚呢?

评分

参与人数 1技术 +1 收起 理由
codegay + 1 1

查看全部评分

发表于 2016-3-31 10:18:49 | 显示全部楼层
本帖最后由 happy886rr 于 2016-3-31 11:06 编辑

回复 10# wzf1024
你提的问题是移动第2行到第4行和第5行之间,所以用了a、b、c、d。当然如果要把第999行移动到第1999行和2000行之间,那更省字母了只需要一个字母a来显示那一行。请看下边代码:支持各种特殊字符叹号路径文件名,其实一行代码就能解决问题,主要是用纯批处理为了兼容各种特殊字符及路径就得这么写、至于扩展还支持倒着插参数随意改、变量延迟也不能提前开,只能这么写、也只能more。

  1. @echo off
  2. REM 支持倒着插,如把第6000行插入到第3行

  3. REM 要提取的行
  4. set k1=6000
  5. REM 插入的位置
  6. set k2=3

  7. if %k1% equ %k2% (exit)
  8. if %k1% gtr %k2% (set gk=1)
  9. for /f "delims=" %%T in ('dir /a-d /b /s *.txt') do (
  10.         CD "%%~dpT"
  11.         if defined gk (
  12.                 sort /+1888 /rec 1888 "%%T" /o temp
  13.                 for /f %%a in ('find /c /v ""^<temp') do (set/a k1=%%a-k1+1,k2=%%a-k2+1)
  14.         ) else (
  15.                 ren "%%T" temp
  16.         )
  17.         setlocal enabledelayedexpansion
  18.         more +!k2! temp>tmp2
  19.         set/p =;<nul>>temp
  20.         for /f %%a in ('find /c /v ""^<temp') do (
  21.                 set/a L=%%a
  22.                 if !k1! leq 0 (echo 总共才%%a行,参数设置有误!&del temp&del tmp2&set/p=&exit)
  23.                 if !k2! leq 0 (echo 总共才%%a行,参数设置有误!&del temp&del tmp2&set/p=&exit)
  24.         )
  25.         set/a K=k1-1,L1=L-K,L2=L-k2
  26.         sort /+1888 /rec 1888 temp /o tmp
  27.         more +!L1! tmp|sort /+1888 /rec 1888 /o tmp1
  28.         more +!k1! temp|sort /+1888 /rec 1888 /o tmp
  29.         more +!L2! tmp|sort /+1888 /rec 1888 >>tmp1
  30.         more +!K! temp>tmp &del temp
  31.         (set/p a=&echo;!a!&endlocal)<tmp>>tmp1 &del tmp
  32.         find /v ""<tmp2>>tmp1 &del tmp2
  33.         if defined gk (
  34.                 sort /+1888 /rec 1888 "tmp1" /o "%%T" &del tmp1
  35.         ) else (
  36.                 move tmp1 "%%T"
  37.         )
  38. )
复制代码

评分

参与人数 1技术 +1 收起 理由
wzf1024 + 1 乐于助人。再次感谢

查看全部评分

发表于 2016-3-31 10:20:00 | 显示全部楼层
  1. @if (0)==(0) echo off
  2. for /f "delims=" %%i in ('dir /b /s *.txt') do (
  3.     type "%%i" | cscript //nologo //e:jscript "%~f0" > "%%i.Log"
  4. )
  5. pause & exit
  6. @end

  7. var srcLine = 6, dstLine = 4; //第6行移动到第4行
  8. var arr = WSH.StdIn.ReadAll().replace(/\r\n$/, '').split('\r\n');
  9. var str = arr[srcLine-1];
  10. arr.splice(srcLine-1, 1); //删除
  11. arr.splice(dstLine-1, 0, str); //插入

  12. WSH.Echo(arr.join('\r\n'));
复制代码

评分

参与人数 1技术 +1 收起 理由
wzf1024 + 1 乐于助人。非常感激大大跟踪

查看全部评分

发表于 2016-3-31 12:03:11 | 显示全部楼层

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in (r1.txt) do (
  4.     set/a n+=1
  5.     if !n! equ 1 set "a1=%%i"
  6.     if !n! equ 2 set "a2=%%i"
  7.     if !n! equ 3 set "a3=%%i"
  8.     if !n! equ 4 set "a4=%%i"
  9.     if !n! equ 5 set "a5=%%i"
  10. )
  11. for /f "skip=5 delims=" %%i in (r1.txt) do (
  12.     set/a a+=1
  13.     if !a! equ 1 >temp.txt (
  14.         echo,!a1!
  15.         echo,!a3!
  16.         echo,!a4!
  17.         echo,!a2!
  18.         echo,!a5!
  19.         )
  20.     echo,%%i >>temp.txt
  21. )
  22. pause
复制代码
最笨的办法吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 13:40 , Processed in 0.008456 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表