Board logo

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

作者: wzf1024    时间: 2016-3-30 00:31     标题: [已解决]如何将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
……
好复杂啊,难死阿菜我了,大侠救命啊
作者: qq692172929    时间: 2016-3-30 02:12

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

作者: WHY    时间: 2016-3-30 08:32

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

作者: gawk    时间: 2016-3-30 09:14

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

作者: happy886rr    时间: 2016-3-30 12:15

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

作者: wzf1024    时间: 2016-3-30 14:54

回复 2# qq692172929


    没有效果
作者: wzf1024    时间: 2016-3-30 15:00

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

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

回复 4# gawk


    大侠,弱弱问一句,怎么扩展到子文件夹?
还有,如果子文件夹存在同名文件捏?
最好文件在原位置,不要移动
作者: happy886rr    时间: 2016-3-30 15:04

回复 8# wzf1024
能扩展呀,你把4可以改为任意行都可以。前面在加一句more
作者: wzf1024    时间: 2016-3-30 15:17

回复 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…………………………?
作者: gawk    时间: 2016-3-31 09:16

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

作者: WHY    时间: 2016-3-31 10:18

回复 7# wzf1024


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

既然有这种需求,为何不在顶楼交代代清楚呢?
作者: happy886rr    时间: 2016-3-31 10:18

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

作者: WHY    时间: 2016-3-31 10:20

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

作者: apython    时间: 2016-3-31 12:03

  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
复制代码
最笨的办法吧。
作者: wzf1024    时间: 2016-3-31 12:38

回复 12# WHY


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

回复 14# WHY


    大大的代码是两行交换位置,不是插入
作者: pcl_test    时间: 2016-4-1 21:39

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

回复 17# wzf1024

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

作者: CrLf    时间: 2016-4-4 18:13

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

作者: codegay    时间: 2016-4-4 19:05

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





欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2