Board logo

标题: [文本处理] 批处理怎样给文本添加序号及按行分割? [打印本页]

作者: youaoyi    时间: 2008-7-7 10:06     标题: 批处理怎样给文本添加序号及按行分割?


请问 findstr /n ".*" test.txt 这个命令添加行号时,

如何才能让按照 输入者指定一个数字开始列序号呢?

比如: 输入 100,  每行前的序号就从100开始向后排 ....

不求有上面的命令这么迅速, 但求尽量能快些,因为数据量委实很大.

请问sed命令完成上述的工作么?

还有,下面的命令有点小问题:

1、如果当前行以反斜杠“\”结束,则将下一行并到当前行末尾,并去掉原来行尾的反斜杠
sed -e :a -e "/\\$/N; s/\\\n//; ta" a.txt >b.txt     

这个命令也会同时删除TXT文档中所有的空行?

======================================================

2、 sed能否按照每6万条数据来分割TXT文档呢?

======================================================

已解决: sed = a.txt | sed "N;s/\n/|/" |find /v "" >abc.txt

询问的问题:


findstr /n ".*" test.txt   添加行号速度是很快的,

问题是如何才能不在行号后添加":"   而改为添加 "|" 这个符号呢?







[ 本帖最后由 youaoyi 于 2008-7-10 13:13 编辑 ]
作者: 随风    时间: 2008-7-7 10:27

没考虑a.txt内容有冒号开头的情况。
  1. @echo off
  2. for /f "tokens=1* delims=:" %%a in ('findstr /n .* a.txt') do echo %%a ^| %%b
  3. pause
复制代码

作者: youaoyi    时间: 2008-7-7 11:16

测试一个30兆的文本文件,

原来的命令几秒钟序号就添加完毕了,

上面的这条命令十几分钟后仍在处理中,

没能等到处理完毕 Ctrl + C 了 ....
作者: 随风    时间: 2008-7-7 11:45

呵呵,处理文本 findstr 是比 for 要快多了。
作者: batman    时间: 2008-7-7 16:33

原帖由 随风 于 2008-7-7 11:45 发表
呵呵,处理文本 findstr 是比 for 要快多了。

之所以效率低了这么多是因为随风用了for+findstr语式,兄弟可以试下如下代码,看效率怎么样:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (a.txt) do set /a n+=1&echo !n! ^|%%i
复制代码

[ 本帖最后由 zw19750516 于 2008-7-7 16:41 编辑 ]
作者: 随风    时间: 2008-7-7 17:52

3楼已经说了,用findstr只要几秒,用for+findstr用了十几分钟还没完成。
那么zw兄的纯for应该也就是比for+findstr节约了几秒钟而以
其实对大的文件处理建议还是用外部工具,比如sed论坛的第三方软件就有下载的
30兆的文件不知道有多少行,我测试7万行耗时8秒,应该可以接受吧。。。
不过还是finstr快,只要1秒
:
  1. @echo off
  2. sed = a.txt | sed "N;s/\n/|/" |find /v "" >abc.txt
  3. start abc.txt
复制代码

[ 本帖最后由 随风 于 2008-7-7 18:10 编辑 ]
作者: youaoyi    时间: 2008-7-10 08:28     标题: 继续求教

请问 findstr /n ".*" test.txt 这个命令添加行号时,
如何才能让按照 输入者指定一个数字开始列序号呢?
比如: 输入 100,  每行前的序号就从100开始向后排 ....
不求有上面的命令这么迅速, 但求尽量能快些,因为数据量委实很大.

[ 本帖最后由 youaoyi 于 2008-7-10 08:32 编辑 ]
作者: batman    时间: 2008-7-10 08:47

这个用findstr /n是做不到的,只有用for(除第三方工具外)
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p n=请输入初始行号
  3. for /f "delims=" %%i in (a.txt) do set /a n+=1&echo !n! ^|%%i
复制代码

作者: youaoyi    时间: 2008-7-10 09:08

那么请问sed命令可以做到上面的输入指定序号的工作么?

还有,下面的命令有点小问题:

1、如果当前行以反斜杠“\”结束,则将下一行并到当前行末尾,并去掉原来行尾的反斜杠
sed -e :a -e "/\\$/N; s/\\\n//; ta" a.txt >b.txt     

这个命令也会同时删除TXT文档中所有的空行?

======================================================

2、 sed能否按照每6万条数据来分割TXT文档呢?

======================================================

无关备查: 如果当前行以等号开头,将当前行并到上一行末尾,并以单个空格代替原来行头的“=”
sed -e :a -e "$!N;s/\n=/ /;ta" -e "P;D"

[ 本帖最后由 youaoyi 于 2008-7-10 11:25 编辑 ]
作者: 随风    时间: 2008-7-10 13:01

首先请仔细阅读版规,再请修改标题。。。。
http://bathome.net/viewthread.php?tid=963&extra=page%3D1
作者: youaoyi    时间: 2008-7-10 13:14

已经修改标题,不知是否妥当.
作者: 随风    时间: 2008-7-10 13:28

2、 sed能否按照每6万条数据来分割TXT文档呢?
假设总行数是100000行
:
  1. @echo off
  2. set /a z=100000
  3. :loop
  4. set /a n=m+1,m+=60000,wjm+=1
  5. sed -n "%n%,%m%p" a.txt|find /v "" >%wjm%.txt
  6. if %m% lss %z% goto loop
  7. pause
复制代码

作者: youaoyi    时间: 2008-7-10 14:43

关键问题是行数100000并不是可以确定的数据啊...

如果之前已经使用了 "sed = a.txt | sed "N;s/\n/|/" |find /v "" >b.txt"添加了行号,

是否能够在生成的 b.txt 文件中取到这个总行数值呢?




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