![Board logo](images/default/logo.gif)
标题: [文本处理] 批处理怎样将目录下的所有文本文件内的文本相邻奇偶行互换? [打印本页]
作者: 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 ![](http://www.bathome.net/images/common/back.gif)
(⊙v⊙)嗯,用的是notepad2,那些数字是文本前面的行号~
作者: weichenxiehou 时间: 2011-9-14 08:29
本帖最后由 weichenxiehou 于 2011-9-14 09:33 编辑
- @echo off&setlocal enabledelayedexpansion
- set n=&set odd=
- (for /f "delims=" %%i in (a.txt) do (
- set/a n+=1,m=n%%2
- if !m! equ 1 (set "odd=%%i") else echo,%%i&echo,!odd!
- ))>new.txt
- 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
- @echo off&setlocal enabledelayedexpansion
- for /f %%a in ('findstr /n .* a.txt') do (
- setlocal
- set /p a=
- set /p b=
- echo !b!&echo !a!
- endlocal
- )<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
言之有理,原楼代码还原,新代码贴于此:- @echo off&setlocal enabledelayedexpansion
- set n=&set odd=
- (for /f "delims=" %%i in (a.txt) do (
- set/a n+=1,m=n%%2
- if !m! equ 1 (set "odd=%%i") else echo,%%i&echo,!odd!
- ))>new.txt
- 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在这里是怎样工作的呢?- @echo off
- setlocal enabledelayedexpansion
- (for /f %%a in (a.txt) do (
- setlocal
- set /p a=
- set /p b=
- if "!b!" neq "" (
- echo,!b!
- )
- if "!a!" neq "" (
- echo,!a!
- )
- endlocal
- ))<a.txt
复制代码
作者: CrLf 时间: 2011-9-14 11:00
不好意思,手快没考虑清楚...应该是:- @echo off&setlocal enabledelayedexpansion
- (for /f %%a in ('find /c /v ""^<a.txt') do (
- for /l %%b in (1 2 %%a) do (
- set a=&set b=
- set /p a=
- set /p b=
- echo !b!&echo !a!
- )
- ))<a.txt>b.txt
复制代码
如果要修改多个文本,改一下就行了:- @echo off&setlocal enabledelayedexpansion
- for %%i in (*.*) do (
- (for /f %%a in ('find /c /v ""^<a.txt') do (
- for /l %%b in (1 2 %%a) do (
- set a=&set b=
- set /p a=
- set /p b=
- echo !b!&echo !a!
- )
- ))<%%i>$
- move $ "%%i"
- )
复制代码
findstr 确实是为了兼容空行,但是此处应该直接用 find 获取行数比较简单,我把两种效果的思路搞混了。
至于 setlocal 和 endlocal 则是为了开闭一个临时的变量表用于临时保存变量,避免影响之后的操作。其实也不够严谨,因为无法保证 setlcoal 之前 变量a 和变量b 都为空,所以还是应该直接用 set 清空变量
作者: fanfande 时间: 2011-9-14 11:05
![](images/smilies/default/hug.gif)
多谢各位鼎力相助!
来日慢慢图报!
作者: fanfande 时间: 2011-9-14 16:00
不好意思,手快没考虑清楚...应该是:如果要修改多个文本,改一下就行了:findstr 确实是为了兼容空行,但是 ...
CrLf 发表于 2011-9-14 11:00 ![](http://www.bathome.net/images/common/back.gif)
测试了一下,好像运行错误!找不到文件,我是放在一个文件夹内运行的
作者: hankerer 时间: 2011-9-14 16:16
不好意思,手快没考虑清楚...应该是:如果要修改多个文本,改一下就行了:findstr 确实是为了兼容空行,但是 ...
CrLf 发表于 2011-9-14 11:00 ![](http://bbs.bathome.net/images/common/back.gif)
可以成功运行。
但如果存在空行就会出错。
版主能说明一下运行的原理吗?
set /p a=<a.txt 这样子不是只有第一行会赋给变显吗?
作者: weichenxiehou 时间: 2011-9-14 18:15
回复 21# hankerer
试试下面的就应该懂了。。- @echo off
- for /l %%i in (1 1 10) do echo,%%i>>a.txt
- type a.txt
- (for /l %%i in (1 1 10) do set/p _a%%i=)<a.txt
- set _a
- pause>nul
复制代码
作者: hankerer 时间: 2011-9-14 18:35
回复 hankerer
试试下面的就应该懂了。。
weichenxiehou 发表于 2011-9-14 18:15 ![](http://bbs.bathome.net/images/common/back.gif)
感谢。我的理解是所有的set /p 操作都保存在缓存里,最后由a.txt一次性输入。每行正好有一个回车换行来模拟输入。不知道理解的对不对。
作者: weichenxiehou 时间: 2011-9-14 18:43
回复 23# hankerer
理解得八九不离十吧……
作者: Seder 时间: 2011-9-14 20:11
- sed -r "N;s/(.*)\n(.*)/\2\n\1/" test.txt
复制代码
作者: FOR 时间: 2011-10-4 23:04
- 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 - @echo off&setlocal enabledelayedexpansion
- md new
- set n=&set odd=
- (for /f "delims=" %%i in (a.txt) do (
- set/a n+=1,m=n%%2
- if !m! equ 1 (set "odd=%%i") else echo,%%i&echo,!odd!
- ))>new\result.txt
- 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
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in (a.txt) do (
- set /a m+=1
- set _!m!=%%i
- )
- set nn=0
- set mm=-1
- :sta
- set /a nn+=2
- set /a mm+=2
- if defined _%nn% echo.!_%nn%!
- if defined _%mm% echo.!_%mm%!
- if !nn! lss !m! goto sta
- pause
复制代码
作者: fanfande 时间: 2011-11-28 15:56
回复 31# 545810831
你好,这个还是对a.txt单个文件的处理!
请问如何批处理特定目录下的txt文件呢并将新的结果输出到新的文件夹
谢谢你
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |