Board logo

标题: [文本处理] 批处理怎样将目录下的所有文本文件内的文本相邻奇偶行互换? [打印本页]

作者: fanfande    时间: 2011-9-14 07:37     标题: 批处理怎样将目录下的所有文本文件内的文本相邻奇偶行互换?

比方说原来的排行:1,2,3,4,5,6,7,8
处理后的记过排行:2,1,4,3,6,5,8,7

相邻奇偶行互换
作者: Batcher    时间: 2011-9-14 08:05

你这不是奇偶列互换吗,怎么说是行呢?
作者: weichenxiehou    时间: 2011-9-14 08:17

回复 2# Batcher
他说的那些数字应该是指的行号吧……
作者: fanfande    时间: 2011-9-14 08:27

回复  Batcher
他说的那些数字应该是指的行号吧……
weichenxiehou 发表于 2011-9-14 08:17


(⊙v⊙)嗯,用的是notepad2,那些数字是文本前面的行号~
作者: weichenxiehou    时间: 2011-9-14 08:29

本帖最后由 weichenxiehou 于 2011-9-14 09:33 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. set n=&set odd=
  3. (for /f "delims=" %%i in (a.txt) do (
  4.   set/a n+=1,m=n%%2
  5.   if !m! equ 1 (set "odd=%%i") else echo,%%i&echo,!odd!
  6. ))>new.txt
  7. if %m% equ 1 echo,%odd%>>new.txt
复制代码
仅提供了自己想的思路,没去特意注意特殊字符的处理。。
作者: awk    时间: 2011-9-14 08:49

回复 5# weichenxiehou


如果一个文件只有3行数字,这个代码会丢掉最后一行。比如:
1
2
3
作者: weichenxiehou    时间: 2011-9-14 08:51

本帖最后由 weichenxiehou 于 2011-9-14 08:54 编辑

回复 6# awk
不会吧?我最后一行代码特意注意这个问题啊……
作者: CrLf    时间: 2011-9-14 08:57

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f %%a in ('findstr /n .* a.txt') do (
  3.    setlocal
  4.    set /p a=
  5.    set /p b=
  6.    echo !b!&echo !a!
  7.    endlocal
  8. )<a.txt
复制代码

作者: awk    时间: 2011-9-14 08:59

回复 7# weichenxiehou


你自己试试呢,echo,%odd%>>new.txt这个不能把数字3写到文件里面吧?
作者: CrLf    时间: 2011-9-14 09:13

回复 5# weichenxiehou


    可以把最后一行放到整个语块之内,用变量延迟输出变量,这样能省一个重定向
作者: weichenxiehou    时间: 2011-9-14 09:15

回复 10# CrLf
ok,多谢提醒,0-9的数字被当成句柄了,代码已修改,加了个空格,应该可以吧。
作者: weichenxiehou    时间: 2011-9-14 09:23

回复 8# CrLf
不知版主是否会错题意,怎么跑你的程序,结果不对呢?
作者: weichenxiehou    时间: 2011-9-14 09:27

回复 9# awk
还是得感谢awk纠错,多谢!
作者: wc726842270    时间: 2011-9-14 09:30

回复 7# weichenxiehou


    有个小建议,不要在原文的基础上改代码,这样会有一部分人不明白9L是什么意思的!
作者: weichenxiehou    时间: 2011-9-14 09:33

回复 14# wc726842270
言之有理,原楼代码还原,新代码贴于此:
  1. @echo off&setlocal enabledelayedexpansion
  2. set n=&set odd=
  3. (for /f "delims=" %%i in (a.txt) do (
  4.   set/a n+=1,m=n%%2
  5.   if !m! equ 1 (set "odd=%%i") else echo,%%i&echo,!odd!
  6. ))>new.txt
  7. if %m% equ 1 echo,%odd% >>new.txt
复制代码

作者: awk    时间: 2011-9-14 09:35

回复 11# weichenxiehou


这样可以免去多余的空格:
>>new.txt echo,%odd%
echo>>new.txt,%odd%
作者: awk    时间: 2011-9-14 09:48

回复 8# CrLf


向版主学习
能否讲解下为什么要用findstr呢,是为了兼容空行吗,但是空行跟下面的空字符串判断有冲突怎么办?还有setlocal+endlocal在这里是怎样工作的呢?
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f %%a in (a.txt) do (
  4.     setlocal
  5.     set /p a=
  6.     set /p b=
  7.     if "!b!" neq "" (
  8.         echo,!b!
  9.     )
  10.     if "!a!" neq "" (
  11.         echo,!a!
  12.     )
  13.     endlocal
  14. ))<a.txt
复制代码

作者: CrLf    时间: 2011-9-14 11:00

不好意思,手快没考虑清楚...应该是:
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f %%a in ('find /c /v ""^<a.txt') do (
  3.    for /l %%b in (1 2 %%a) do (
  4.       set a=&set b=
  5.       set /p a=
  6.       set /p b=
  7.       echo !b!&echo !a!
  8.    )
  9. ))<a.txt>b.txt
复制代码
如果要修改多个文本,改一下就行了:
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%i in (*.*) do (
  3.    (for /f %%a in ('find /c /v ""^<a.txt') do (
  4.       for /l %%b in (1 2 %%a) do (
  5.          set a=&set b=
  6.          set /p a=
  7.          set /p b=
  8.          echo !b!&echo !a!
  9.       )
  10.    ))<%%i>$
  11.    move $ "%%i"
  12. )
复制代码
findstr 确实是为了兼容空行,但是此处应该直接用 find 获取行数比较简单,我把两种效果的思路搞混了。
至于 setlocal 和 endlocal 则是为了开闭一个临时的变量表用于临时保存变量,避免影响之后的操作。其实也不够严谨,因为无法保证 setlcoal 之前 变量a 和变量b 都为空,所以还是应该直接用 set 清空变量
作者: fanfande    时间: 2011-9-14 11:05


多谢各位鼎力相助!
来日慢慢图报!
作者: fanfande    时间: 2011-9-14 16:00

不好意思,手快没考虑清楚...应该是:如果要修改多个文本,改一下就行了:findstr 确实是为了兼容空行,但是 ...
CrLf 发表于 2011-9-14 11:00



    测试了一下,好像运行错误!找不到文件,我是放在一个文件夹内运行的
作者: hankerer    时间: 2011-9-14 16:16

不好意思,手快没考虑清楚...应该是:如果要修改多个文本,改一下就行了:findstr 确实是为了兼容空行,但是 ...
CrLf 发表于 2011-9-14 11:00



    可以成功运行。
但如果存在空行就会出错。

版主能说明一下运行的原理吗?

set /p a=<a.txt 这样子不是只有第一行会赋给变显吗?
作者: weichenxiehou    时间: 2011-9-14 18:15

回复 21# hankerer
试试下面的就应该懂了。。
  1. @echo off
  2. for /l %%i in (1 1 10) do echo,%%i>>a.txt
  3. type a.txt
  4. (for /l %%i in (1 1 10) do set/p _a%%i=)<a.txt
  5. set _a
  6. pause>nul
复制代码

作者: hankerer    时间: 2011-9-14 18:35

回复  hankerer
试试下面的就应该懂了。。
weichenxiehou 发表于 2011-9-14 18:15



    感谢。我的理解是所有的set /p 操作都保存在缓存里,最后由a.txt一次性输入。每行正好有一个回车换行来模拟输入。不知道理解的对不对。
作者: weichenxiehou    时间: 2011-9-14 18:43

回复 23# hankerer
理解得八九不离十吧……
作者: Seder    时间: 2011-9-14 20:11

  1. sed -r "N;s/(.*)\n(.*)/\2\n\1/" test.txt
复制代码

作者: FOR    时间: 2011-10-4 23:04

  1. gawk "{if(getline s)print s;print}" a.txt
复制代码

作者: fanfande    时间: 2011-11-24 13:52

回复 15# weichenxiehou


    你好我想请教你一个问题
假如是用这个批处理一个文件夹里面的所有txt,然后将处理结果输出到新的文件夹

@echo off&setlocal enabledelayedexpansion
set n=&set odd=
(for /f "delims=" %%i in (dir /a-d/b *.txt') do (
  set/a n+=1,m=n%%2
  if !m! equ 1 (set "odd=%%i") else echo,%%i&echo,!odd!
))md new
if %m% equ 1 echo,%odd% >>new.txt

这样好像不行,将他们的结果输出到新的文件夹如何表示的
作者: awk    时间: 2011-11-24 14:50

回复 27# fanfande
  1. @echo off&setlocal enabledelayedexpansion
  2. md new
  3. set n=&set odd=
  4. (for /f "delims=" %%i in (a.txt) do (
  5.   set/a n+=1,m=n%%2
  6.   if !m! equ 1 (set "odd=%%i") else echo,%%i&echo,!odd!
  7. ))>new\result.txt
  8. if %m% equ 1 echo,%odd% >>new\result.txt
复制代码

作者: fanfande    时间: 2011-11-26 16:57

回复 26# FOR


    假如是用这个批处理一个文件夹里面的所有txt,然后将各自的处理结果输出到新的文件夹内,如何写呢?谢谢你哦!
作者: fanfande    时间: 2011-11-26 17:01

回复 28# awk


   
您上面这个还是仅仅处理a.txt然后把结果输出到新的文件夹以result.txt
假如是用这个批处理一个文件夹里面的所有txt,然后将各自的处理结果输出到新的文件夹内,如何写呢?
我用for /f "delims=" %%I in ('*.txt') do ( 不行,没成功,我在死板硬套,
谢谢你哦!
作者: 545810831    时间: 2011-11-26 19:42

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (a.txt) do (
  3. set /a m+=1
  4. set _!m!=%%i
  5. )
  6. set nn=0
  7. set mm=-1
  8. :sta
  9. set /a nn+=2
  10. set /a mm+=2
  11. if defined _%nn% echo.!_%nn%!
  12. if defined _%mm% echo.!_%mm%!
  13. if !nn! lss !m! goto sta
  14. pause  
复制代码

作者: fanfande    时间: 2011-11-28 15:56

回复 31# 545810831


    你好,这个还是对a.txt单个文件的处理!
请问如何批处理特定目录下的txt文件呢并将新的结果输出到新的文件夹
谢谢你




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