Board logo

标题: [文本处理] [已解决]批处理用for去掉目录及子目录下的文本的前2行 [打印本页]

作者: gorwoo    时间: 2009-9-29 09:11     标题: [已解决]批处理用for去掉目录及子目录下的文本的前2行

假设当前目录下有N个文件夹,每个文件夹里面有M层目录和上万个.log文件,我想将每个文本的前两行去掉,在原路径重新创建与原文件名一致再加.txt扩展名的文件。
我的代码如下,恳请赐教:
  1. @echo off
  2. for /f %%a in ('dir /s /b ') do (
  3.   for /f "skip=2" %%b in (%%a) do (
  4.     (echo %%b)>%%a.txt
  5.   )
  6. )
  7. pause
复制代码

可以在原路径输出文件,但每个文件只剩下一行文本,不知道错在哪里。


6楼asnahu兄的代码可以,另外,大家可以思考下,若不用more命令,能否完成呢?
另外,如果这些文件中有部分文件前N行有空行,应如何去掉这些空行呢?(注意是行不是列)


结贴了,感谢asnahu兄的支持。

[ 本帖最后由 gorwoo 于 2009-9-29 14:05 编辑 ]
作者: gorwoo    时间: 2009-9-29 09:35

可以输出文件,证明思路应该可行,但是所新建的每个文件只剩下一行文本的第一列,实在不知道错在哪里。请高手指点!

[ 本帖最后由 gorwoo 于 2009-9-29 12:54 编辑 ]
作者: gorwoo    时间: 2009-9-29 10:21

请版主们赐教,谢谢!

[ 本帖最后由 gorwoo 于 2009-9-29 12:51 编辑 ]
作者: asnahu    时间: 2009-9-29 10:32

行处理用SED更方便:
  1. @echo off
  2. for /f "delims=" %%a in ('dir /s/b *.log') do (
  3.     sed "1,2d;" "%%~a"|sed "s/$/\r/g">"%%~a.txt"
  4. )
  5. exit
复制代码
sed:http://www.vkill.net/tools/sed_4.1.5.rar

[ 本帖最后由 asnahu 于 2009-9-29 10:35 编辑 ]
作者: gorwoo    时间: 2009-9-29 10:41

请问楼上的,能用for直接完成吗?可以输出文件了,但每个文件只剩下一行文本,不知道错在哪里。
  1. @echo off
  2. for /f %%a in ('dir /s /b ') do (
  3. for /f "skip=2" %%b in (%%a) do (
  4. (echo %%b)>%%a.txt
  5. )
  6. )
  7. pause
复制代码

[ 本帖最后由 gorwoo 于 2009-9-29 12:48 编辑 ]
作者: asnahu    时间: 2009-9-29 10:52

用FOR其实没那么复杂:
  1. @echo off
  2. for /f "delims=" %%a in ('dir /s/b *.log') do (
  3.     more +2 "%%~a">"%%~a.txt"
  4. )
  5. exit
复制代码

作者: gorwoo    时间: 2009-9-29 11:05

asnahu兄,经测试,你的代码可以,不过在目录下会多创建一些以目录名为名的txt文件,大体上成功,more的用法不熟悉,能解析下么,谢谢。
作者: gorwoo    时间: 2009-9-29 11:10

asnahu兄的代码可以,若不用more命令,能否完成呢?
另外,如果这些文件中有部分文件前N行有空行,应如何去掉这些空行呢?(注意是行不是列)

结贴了,感谢asnahu兄的支持。

[ 本帖最后由 gorwoo 于 2009-9-29 14:05 编辑 ]
作者: Batcher    时间: 2009-9-29 14:30     标题: 回复 8楼 的帖子

使用关键字空行搜索本论坛,能找到不少实例,你先自己试试?

Q: 如何使用论坛搜索功能来解决自己的问题?
A: 参考:批处理之家论坛使用常见问题FAQ
http://bbs.bathome.net/thread-3473-1-1.html
作者: wxcute    时间: 2009-9-29 14:31

  1. @echo off
  2. for /f "delims=" %%a in ('dir/s/b/a-d *.log') do (
  3.  cd.>"%%a.txt"
  4.  for /f "usebackq delims=" %%b in ("%%a") do (
  5.   set/a n+=1
  6.   set L=%%b
  7.   setlocal enabledelayedexpansion
  8.   if !n! gtr 2 (echo !L!)>>"%%a.txt"
  9.   endlocal
  10.  )
  11. )
复制代码

作者: asnahu    时间: 2009-9-29 18:19     标题: 回复 8楼 的帖子

不好意思来晚了,对于行的处理我想还是SED好用,只要一两行代码即可。在for命令中使用delims即可过滤空行,另外findstr查找非空内容也可以过滤空行,就执行效率来说用前一种更好。




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