标题: [文本处理] 批处理如何批量调换txt两列的位置,如调换第一列与第三列的位置? [打印本页]
作者: nihaoareyou 时间: 2015-1-11 13:02 标题: 批处理如何批量调换txt两列的位置,如调换第一列与第三列的位置?
好多txt文件,怎么批量调换两列的位置,如调换第一列与第三列的位置。
作者: mms0536 时间: 2015-1-11 13:40
如果固定有n列就好处理
作者: nihaoareyou 时间: 2015-1-11 13:49
回复 2# mms0536
列数都是相同且固定的。
作者: apang 时间: 2015-1-11 14:47
本帖最后由 apang 于 2015-1-11 15:38 编辑
- sed -i -r "s/^\s*(\S+)(\s+\S+\s+)(\S+)/\3\2\1/" *.txt
复制代码
sed 自行搜索下载
作者: nihaoareyou 时间: 2015-1-11 15:52
回复 4# apang
找不到64位系统兼容的sed。有别的方法吗?bat之类的
作者: mms0536 时间: 2015-1-11 16:41
回复 5# nihaoareyou - @echo off
- mkdir ok_dir
- for /r "txt所在目录" %%i in (*.txt) do (
- for /f "tokens=1,2,3 delims= " %%a in (%%i) do (
- call :del_str %%a %%b %%c %%i
- )
- )
- :del_dir
- echo %3 %2 %1 >.\ok_dir\%~n3.txt
- )
复制代码
作者: mms0536 时间: 2015-1-11 16:42
回复 5# nihaoareyou
咋感觉你就是翻来覆去那几个问题啊......
你找一个写好的代码搞懂你自己就会了
作者: nihaoareyou 时间: 2015-1-11 16:58
回复 7# mms0536
两个问题是有点相似,bat一点没接触,很多字符和语句都不明白什么意思,见谅哈。
作者: nihaoareyou 时间: 2015-1-11 17:05
回复 6# mms0536
这个运行后,输出的txt显示ECHO处于关闭状态。
作者: mms0536 时间: 2015-1-11 17:34
本帖最后由 mms0536 于 2015-1-11 17:41 编辑
回复 9# nihaoareyou - @echo off
- mkdir ok_dir
- for /r "txt所在目录" %%i in (*.txt) do (
- for /f "usebackq tokens=1,2,3 delims= " %%a in ("%%i") do (
- call :del_str %%a %%b %%c %%i
- )
- )
- :del_str
- echo %3 %2 %1 >.\ok_dir\%~n3.txt
- )
复制代码
作者: DAIC 时间: 2015-1-11 17:44
回复 5# nihaoareyou
这里有可以用的版本:
http://bbs.bathome.net/thread-3981-1-1.html
作者: DAIC 时间: 2015-1-11 17:49
- @echo off
- for /f "delims=" %%i in ('dir /b *.txt') do (
- gawk "{s=$1;$1=$3;$3=s;print}" "%%i" > "%%i.new"
- move /y "%%i.new" "%%i"
- )
复制代码
作者: apang 时间: 2015-1-11 20:43
- @set @n=0;//&dir /b *.txt|cscript -nologo -e:jscript "%~0" & pause & exit/b
-
- fso = new ActiveXObject("Scripting.FileSystemObject");
- while (!WScript.StdIn.AtEndOfStream) {
- file = WScript.StdIn.ReadLine();
- f = fso.OpenTextFile(file, 1);
- txt = f.ReadAll();
- f.Close();
- txt = txt.replace(/(\S+)(\s+\S+\s+)(\S+)(.*)$/mg, "$3$2$1$4");
- f = fso.OpenTextFile(file, 2);
- f.Write(txt);
- f.close(); f = null
- }
复制代码
作者: nihaoareyou 时间: 2015-1-11 22:55
回复 13# apang
这个具体怎么操作呢?是和bat一样的运行吗?
作者: nihaoareyou 时间: 2015-1-11 23:00
回复 12# DAIC
这个有点问题,运行之后所有txt都成空白了。
作者: nihaoareyou 时间: 2015-1-11 23:05
回复 10# mms0536
这个只能调换一个txt的,也就是说处理后的文件夹中只有一个txt,而且这个txt的名称也被改为原来第三列的第一个字符串了。
作者: DAIC 时间: 2015-1-12 08:40
回复 15# nihaoareyou
你有 gawk.exe 吗?没有的话下载一个吧
作者: 慕夜蓝化 时间: 2015-1-12 11:11
- @echo off
- for /f "delims=" %%i in (1.txt) do (
- call :a %%i
- )
- pause&exit
-
- :a
- (echo,%3 %2 %1) >>2.txt
- goto :eof
复制代码
这里测试的是将一列和三列互换的,只要不含有一些特殊的字符分隔符,默认以空格为分隔符,你可以试一下。
作者: nihaoareyou 时间: 2015-1-12 15:40
回复 18# 慕夜蓝化
大神,在帮我改改哈?这个只能修改一个文件的,而且文件名称也变了。我想批量修改很多个txt,而且名称和原来的保持一致。
作者: terse 时间: 2015-1-12 15:49
回复 19# nihaoareyou
运行前 先备份- @echo off
- for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
- (for /f "usebackqtokens=1-3*" %%a in ("%%i") do (
- echo %%c %%b %%a %%e
- ))>"%temp%\$"
- move "%temp%\$" "%%i"
- )
- pause
复制代码
作者: nihaoareyou 时间: 2015-1-12 15:51
回复 20# terse
问题终于解决了,谢大神!点赞
作者: 慕夜蓝化 时间: 2015-1-12 16:16
回复 19# nihaoareyou - @echo off
- for %%i in (*txt) do (
- for /f "usebackq delims=" %%a in ("%%i") do (
- call :a %%a
- )
- move /y $β "%%~fsi" >nul 2>nul
- )
- pause&exit
-
- :a
- (echo,%3 %2 %1) >>$β
- goto :eof
复制代码
这个对当前文件夹下的所有文件有效。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |