[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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
……
好复杂啊,难死阿菜我了,大侠救命啊

本帖最后由 codegay 于 2016-4-4 19:32 编辑
  1. """
  2. python移动文本第A行到第N行.py
  3. http://bbs.bathome.net/thread-39853-2-1.html
  4. 2016年4月4日 18:50:06 codegay
  5. 这个问题本质等于把列表元素第A个移动到第N....
  6. """
  7. with open("22.txt") as f:
  8.     txt=f.readlines()
  9.     txt.insert(4,txt[1])#第二行插入第五行的位置
  10.     del(txt[1])#删除原来的第二行
  11.     print(txt)
复制代码
  1. #方法2
  2. a=list("1234567")
  3. a.insert(3,a.pop(1))#弹出第二行插入到第四行
  4. print(a)
复制代码
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

  1. @sed "2{h;d};4{G}" 旧.txt >新.txt
复制代码

TOP

本帖最后由 pcl_test 于 2016-4-3 13:46 编辑

回复 17# wzf1024

修改下
  1. srcLine<dstLine?arr.splice(dstLine-1, 0, str):arr.splice(dstLine, 0, str); //插入
复制代码

TOP

回复 14# WHY


    大大的代码是两行交换位置,不是插入

TOP

回复 12# WHY


    大侠,不好意思,没说清楚,你之前的代码已经能够实现我的目的了,再次感谢。
所说的扩展是在对比几个代码后的话,希望你不要介意哈。抱歉没说清楚。

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

  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

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

回复 7# wzf1024


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

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

评分人数

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

回复 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
能扩展呀,你把4可以改为任意行都可以。前面在加一句more

TOP

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

回复 4# gawk


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

TOP

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

TOP

返回列表