Board logo

标题: [文本处理] 批处理如何批量调换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 编辑
  1. 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
  1. @echo off
  2. mkdir ok_dir
  3. for /r "txt所在目录" %%i in (*.txt) do (
  4. for /f "tokens=1,2,3 delims= " %%a in (%%i) do (
  5. call :del_str %%a %%b %%c %%i
  6. )
  7. )
  8. :del_dir
  9. echo %3 %2 %1 >.\ok_dir\%~n3.txt
  10. )
复制代码

作者: 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
  1. @echo off
  2. mkdir ok_dir
  3. for /r "txt所在目录" %%i in (*.txt) do (
  4. for /f "usebackq tokens=1,2,3 delims= " %%a in ("%%i") do (
  5. call :del_str %%a %%b %%c %%i
  6. )
  7. )
  8. :del_str
  9. echo %3 %2 %1 >.\ok_dir\%~n3.txt
  10. )
复制代码

作者: DAIC    时间: 2015-1-11 17:44

回复 5# nihaoareyou


这里有可以用的版本:
http://bbs.bathome.net/thread-3981-1-1.html
作者: DAIC    时间: 2015-1-11 17:49

  1. @echo off
  2. for /f "delims=" %%i in ('dir /b *.txt') do (
  3.     gawk "{s=$1;$1=$3;$3=s;print}" "%%i" > "%%i.new"
  4.     move /y "%%i.new" "%%i"
  5. )
复制代码

作者: apang    时间: 2015-1-11 20:43

  1. @set @n=0;//&dir /b *.txt|cscript -nologo -e:jscript "%~0" & pause & exit/b
  2. fso = new ActiveXObject("Scripting.FileSystemObject");
  3. while (!WScript.StdIn.AtEndOfStream) {
  4.         file = WScript.StdIn.ReadLine();
  5.         f = fso.OpenTextFile(file, 1);
  6.         txt = f.ReadAll();
  7.         f.Close();
  8.         txt = txt.replace(/(\S+)(\s+\S+\s+)(\S+)(.*)$/mg, "$3$2$1$4");
  9.         f = fso.OpenTextFile(file, 2);
  10.         f.Write(txt);
  11.         f.close(); f = null
  12. }
复制代码

作者: 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

  1. @echo off
  2. for /f "delims=" %%i in (1.txt) do (
  3.         call :a %%i
  4. )
  5. pause&exit
  6. :a
  7. (echo,%3 %2 %1) >>2.txt
  8. goto :eof
复制代码
这里测试的是将一列和三列互换的,只要不含有一些特殊的字符分隔符,默认以空格为分隔符,你可以试一下。
作者: nihaoareyou    时间: 2015-1-12 15:40

回复 18# 慕夜蓝化


    大神,在帮我改改哈?这个只能修改一个文件的,而且文件名称也变了。我想批量修改很多个txt,而且名称和原来的保持一致。
作者: terse    时间: 2015-1-12 15:49

回复 19# nihaoareyou
运行前 先备份
  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  3.     (for /f "usebackqtokens=1-3*" %%a in ("%%i") do (
  4.          echo %%c %%b %%a %%e
  5.     ))>"%temp%\$"
  6.     move "%temp%\$" "%%i"
  7. )
  8. pause
复制代码

作者: nihaoareyou    时间: 2015-1-12 15:51

回复 20# terse


    问题终于解决了,谢大神!点赞
作者: 慕夜蓝化    时间: 2015-1-12 16:16

回复 19# nihaoareyou
  1. @echo off
  2. for %%i in (*txt) do (
  3.     for /f "usebackq delims=" %%a in ("%%i") do (
  4.         call :a %%a
  5.     )
  6.     move /y $β "%%~fsi" >nul 2>nul
  7. )
  8. pause&exit
  9. :a
  10. (echo,%3 %2 %1) >>$β
  11. goto :eof
复制代码
这个对当前文件夹下的所有文件有效。




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