返回列表 发帖
不好意思,手快没考虑清楚...应该是:
@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.txtCOPY
如果要修改多个文本,改一下就行了:
@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"
)COPY
findstr 确实是为了兼容空行,但是此处应该直接用 find 获取行数比较简单,我把两种效果的思路搞混了。
至于 setlocal 和 endlocal 则是为了开闭一个临时的变量表用于临时保存变量,避免影响之后的操作。其实也不够严谨,因为无法保证 setlcoal 之前 变量a 和变量b 都为空,所以还是应该直接用 set 清空变量

TOP

回复 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.txtCOPY

TOP

回复 11# weichenxiehou


这样可以免去多余的空格:
>>new.txt echo,%odd%
echo>>new.txt,%odd%

TOP

回复 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.txtCOPY
看得多说得多,远比不上写得多。

TOP

回复 7# weichenxiehou


    有个小建议,不要在原文的基础上改代码,这样会有一部分人不明白9L是什么意思的!
枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

回复 9# awk
还是得感谢awk纠错,多谢!
看得多说得多,远比不上写得多。

TOP

回复 8# CrLf
不知版主是否会错题意,怎么跑你的程序,结果不对呢?
看得多说得多,远比不上写得多。

TOP

回复 10# CrLf
ok,多谢提醒,0-9的数字被当成句柄了,代码已修改,加了个空格,应该可以吧。
看得多说得多,远比不上写得多。

TOP

回复 5# weichenxiehou


    可以把最后一行放到整个语块之内,用变量延迟输出变量,这样能省一个重定向

TOP

回复 7# weichenxiehou


你自己试试呢,echo,%odd%>>new.txt这个不能把数字3写到文件里面吧?

TOP

@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.txtCOPY

TOP

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

回复 6# awk
不会吧?我最后一行代码特意注意这个问题啊……
看得多说得多,远比不上写得多。

TOP

回复 5# weichenxiehou


如果一个文件只有3行数字,这个代码会丢掉最后一行。比如:
1
2
3

TOP

本帖最后由 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.txtCOPY
仅提供了自己想的思路,没去特意注意特殊字符的处理。。
看得多说得多,远比不上写得多。

TOP

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


(⊙v⊙)嗯,用的是notepad2,那些数字是文本前面的行号~
有创新,多创新;无创新,多模仿;无模仿,多坚持

TOP

返回列表