标题: [文本处理] [已解决]如何将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
- set a1=0
- for /f "delims=*" %%z in (123.txt) do (
- set /a a1+=1
- if not "%a1%"=="2" (echo.%%z >>tmp.txt) else (
- set a2=%%z
- )
- if "%a1%"=="4" echo.%a2% >>tmp.txt
- )
- del /s/q 123.txt
- ren tmp.txt 123.txt
复制代码
作者: WHY 时间: 2016-3-30 08:32
- @echo off & setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b *.txt') do (
- (for %%j in (1 2 3 4) do set /p _%%j=)<"%%i"
- for %%j in (1 3 4 2) do echo;!_%%j!&set "_%%j="
- more +4 "%%i"
- )>"%%i.Log"
- pause
复制代码
作者: gawk 时间: 2016-3-30 09:14
- @echo off
- for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
- gawk "{if(NR==2)s=$0;else if(NR==4)print$0\"\n\"s;else print}" "%%i" > "%%~ni_new.txt"
- )
复制代码
作者: happy886rr 时间: 2016-3-30 12:15
本帖最后由 happy886rr 于 2016-3-30 15:02 编辑
回复 1# wzf1024 跟你上次提的问题一个样,还得用pcl大的方法,照猫画虎- @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 - @echo off
- set path=%~dp0;%path%
- for /f "delims=" %%i in ('dir /b /s /a-d *.txt') do (
- pushd "%%~dpi"
- gawk "{if(NR==2)s=$0;else if(NR==4)print$0\"\n\"s;else print}" "%%i" > "%%~ni_new.txt"
- popd
- )
复制代码
作者: 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。- @echo off
- REM 支持倒着插,如把第6000行插入到第3行
-
- REM 要提取的行
- set k1=6000
- REM 插入的位置
- set k2=3
-
- if %k1% equ %k2% (exit)
- if %k1% gtr %k2% (set gk=1)
- for /f "delims=" %%T in ('dir /a-d /b /s *.txt') do (
- CD "%%~dpT"
- if defined gk (
- sort /+1888 /rec 1888 "%%T" /o temp
- for /f %%a in ('find /c /v ""^<temp') do (set/a k1=%%a-k1+1,k2=%%a-k2+1)
- ) else (
- ren "%%T" temp
- )
- setlocal enabledelayedexpansion
- more +!k2! temp>tmp2
- set/p =;<nul>>temp
- for /f %%a in ('find /c /v ""^<temp') do (
- set/a L=%%a
- if !k1! leq 0 (echo 总共才%%a行,参数设置有误!&del temp&del tmp2&set/p=&exit)
- if !k2! leq 0 (echo 总共才%%a行,参数设置有误!&del temp&del tmp2&set/p=&exit)
- )
- set/a K=k1-1,L1=L-K,L2=L-k2
- sort /+1888 /rec 1888 temp /o tmp
- more +!L1! tmp|sort /+1888 /rec 1888 /o tmp1
- more +!k1! temp|sort /+1888 /rec 1888 /o tmp
- more +!L2! tmp|sort /+1888 /rec 1888 >>tmp1
- more +!K! temp>tmp &del temp
- (set/p a=&echo;!a!&endlocal)<tmp>>tmp1 &del tmp
- find /v ""<tmp2>>tmp1 &del tmp2
- if defined gk (
- sort /+1888 /rec 1888 "tmp1" /o "%%T" &del tmp1
- ) else (
- move tmp1 "%%T"
- )
- )
复制代码
作者: WHY 时间: 2016-3-31 10:20
- @if (0)==(0) echo off
- for /f "delims=" %%i in ('dir /b /s *.txt') do (
- type "%%i" | cscript //nologo //e:jscript "%~f0" > "%%i.Log"
- )
- pause & exit
- @end
-
- var srcLine = 6, dstLine = 4; //第6行移动到第4行
- var arr = WSH.StdIn.ReadAll().replace(/\r\n$/, '').split('\r\n');
- var str = arr[srcLine-1];
- arr.splice(srcLine-1, 1); //删除
- arr.splice(dstLine-1, 0, str); //插入
-
- WSH.Echo(arr.join('\r\n'));
复制代码
作者: apython 时间: 2016-3-31 12:03
- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in (r1.txt) do (
- set/a n+=1
- if !n! equ 1 set "a1=%%i"
- if !n! equ 2 set "a2=%%i"
- if !n! equ 3 set "a3=%%i"
- if !n! equ 4 set "a4=%%i"
- if !n! equ 5 set "a5=%%i"
- )
- for /f "skip=5 delims=" %%i in (r1.txt) do (
- set/a a+=1
- if !a! equ 1 >temp.txt (
- echo,!a1!
- echo,!a3!
- echo,!a4!
- echo,!a2!
- echo,!a5!
- )
- echo,%%i >>temp.txt
- )
- 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
修改下- srcLine<dstLine?arr.splice(dstLine-1, 0, str):arr.splice(dstLine, 0, str); //插入
复制代码
作者: CrLf 时间: 2016-4-4 18:13
- @sed "2{h;d};4{G}" 旧.txt >新.txt
复制代码
作者: codegay 时间: 2016-4-4 19:05
本帖最后由 codegay 于 2016-4-4 19:32 编辑
- """
- python移动文本第A行到第N行.py
- http://bbs.bathome.net/thread-39853-2-1.html
- 2016年4月4日 18:50:06 codegay
- 这个问题本质等于把列表元素第A个移动到第N....
- """
- with open("22.txt") as f:
- txt=f.readlines()
- txt.insert(4,txt[1])#第二行插入第五行的位置
- del(txt[1])#删除原来的第二行
- print(txt)
复制代码
- #方法2
- a=list("1234567")
- a.insert(3,a.pop(1))#弹出第二行插入到第四行
- print(a)
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |