标题: [文本处理] 批处理怎样给文本添加序号及按行分割? [打印本页]
作者: 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内容有冒号开头的情况。- @echo off
- for /f "tokens=1* delims=:" %%a in ('findstr /n .* a.txt') do echo %%a ^| %%b
- 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语式,兄弟可以试下如下代码,看效率怎么样:- @echo off&setlocal enabledelayedexpansion
- 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秒
:- @echo off
- sed = a.txt | sed "N;s/\n/|/" |find /v "" >abc.txt
- 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(除第三方工具外)- @echo off&setlocal enabledelayedexpansion
- set /p n=请输入初始行号
- 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行
:- @echo off
- set /a z=100000
- :loop
- set /a n=m+1,m+=60000,wjm+=1
- sed -n "%n%,%m%p" a.txt|find /v "" >%wjm%.txt
- if %m% lss %z% goto loop
- 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 |