找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 34276|回复: 12

[文本处理] 批处理怎样给文本添加序号及按行分割?

[复制链接]
发表于 2008-7-7 10:06:28 | 显示全部楼层 |阅读模式

请问 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:11 | 显示全部楼层
没考虑a.txt内容有冒号开头的情况。
  1. @echo off
  2. for /f "tokens=1* delims=:" %%a in ('findstr /n .* a.txt') do echo %%a ^| %%b
  3. pause
复制代码
 楼主| 发表于 2008-7-7 11:16:28 | 显示全部楼层
测试一个30兆的文本文件,

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

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

没能等到处理完毕 Ctrl + C 了 ....
发表于 2008-7-7 11:45:41 | 显示全部楼层
呵呵,处理文本 findstr 是比 for 要快多了。
发表于 2008-7-7 16:33:38 | 显示全部楼层
原帖由 随风 于 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:11 | 显示全部楼层
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 编辑 ]
 楼主| 发表于 2008-7-10 08:28:24 | 显示全部楼层

继续求教

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

[ 本帖最后由 youaoyi 于 2008-7-10 08:32 编辑 ]
发表于 2008-7-10 08:47:14 | 显示全部楼层
这个用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
复制代码
 楼主| 发表于 2008-7-10 09:08:12 | 显示全部楼层
那么请问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:08 | 显示全部楼层
首先请仔细阅读版规,再请修改标题。。。。
http://bathome.net/viewthread.php?tid=963&extra=page%3D1
 楼主| 发表于 2008-7-10 13:14:36 | 显示全部楼层
已经修改标题,不知是否妥当.
发表于 2008-7-10 13:28:46 | 显示全部楼层
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
复制代码
 楼主| 发表于 2008-7-10 14:43:54 | 显示全部楼层
关键问题是行数100000并不是可以确定的数据啊...

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

是否能够在生成的 b.txt 文件中取到这个总行数值呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 01:18 , Processed in 0.020856 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表