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

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

本帖最后由 pcl_test 于 2016-11-24 17:44 编辑

很多txt文件,需要将第2行移动到第4行和第5行之间,如某txt内容:
111111
222222
333333
444444
555555
……
操作后成为:
111111
333333
444444
222222
555555
……
好复杂啊,难死阿菜我了,大侠救命啊

  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
复制代码
By:SnJun
Home: http://www.loodd.com

TOP

  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
复制代码

TOP

  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

评分人数

    • wzf1024: 感谢分享,可以扩展技术 + 1
Talk is cheap. Show me the code.
没事不要瞎扯淡,有能耐就把代码贴出来给我看。

TOP

本帖最后由 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")
复制代码

TOP

回复 2# qq692172929


    没有效果

TOP

WHY和happy886rr大大的代码可以操作,但很局限,不能扩展,要是把999行移动到1999行和2000行之间就很麻烦。gawk大大的代码是相比之下的最好的。但还是感谢各位共享代码的大大,感谢你们的帮助,你们都很热心

TOP

本帖最后由 wzf1024 于 2016-3-30 15:22 编辑

回复 4# gawk


    大侠,弱弱问一句,怎么扩展到子文件夹?
还有,如果子文件夹存在同名文件捏?
最好文件在原位置,不要移动

TOP

回复 8# wzf1024
能扩展呀,你把4可以改为任意行都可以。前面在加一句more

TOP

回复 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…………………………?

TOP

回复 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. )
复制代码
Talk is cheap. Show me the code.
没事不要瞎扯淡,有能耐就把代码贴出来给我看。

TOP

回复 7# wzf1024


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

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

评分人数

TOP

本帖最后由 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

评分人数

    • wzf1024: 乐于助人。再次感谢技术 + 1

TOP

  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

评分人数

    • wzf1024: 乐于助人。非常感激大大跟踪技术 + 1

TOP

  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
复制代码
最笨的办法吧。

TOP

返回列表