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

[文本处理] [已解决]批处理怎样提取文本中含有特定文字的行?

[复制链接]
发表于 2011-9-26 23:29:56 | 显示全部楼层 |阅读模式
本帖最后由 lxh623 于 2011-9-30 21:55 编辑

findstr /g:a.txt tmp.txt > b.txt
我查了论坛。他说含义是,在tmp中查找与a精确匹配的每一行。
我不知道这个说法是不是准确。
如果准确,我想问,怎样用文本a的每一行在文本tmp中查找,查到的话把文本tmp那一行写入文本b。(tmp的行可能长于文本a。)

评分

参与人数 1PB +2 收起 理由
CrLf + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

 楼主| 发表于 2011-9-26 23:46:15 | 显示全部楼层
但是,刚才用文本a的任意一行试验,得到的不是精确匹配(我想要的)。而用文本a(含有五十行)不出来任何结果。
如果您有空,麻烦您下载QQ文件,帮我看看。
http://hz.ftn.qq.com/ftn_handler ... 7859a86aa04b2ddca98
发表于 2011-9-27 00:16:35 | 显示全部楼层
哪个帖子说它是精确匹配?
 楼主| 发表于 2011-9-27 07:43:19 | 显示全部楼层
哪个帖子说它是精确匹配?
Batcher 发表于 2011-9-27 00:16

谢谢您!
http://www.bathome.net/viewthread.php?tid=11244
发表于 2011-9-27 08:34:18 | 显示全部楼层
加个 /l 试试,不过/g 开关有 bug,有时候…
 楼主| 发表于 2011-9-27 16:54:38 | 显示全部楼层
加个 /l 试试,不过/g 开关有 bug,有时候…
CrLf 发表于 2011-9-27 08:34

谢谢!怎样加?
发表于 2011-9-30 17:19:03 | 显示全部楼层
本帖最后由 FOR 于 2011-9-30 17:22 编辑
  1. # 2>nul&@echo off&cls&gawk -f "%~fs0" a.txt b.txt&pause
  2. {
  3.         if (NR == FNR) {var[FNR]=$0;i=FNR} else {
  4.                 h=i
  5.                 while (h >= 1){
  6.                         str=match($0,var[h])
  7.                         if (str != 0) print $0
  8.                         h-=1
  9.                 }
  10.         }
  11. }
复制代码

评分

参与人数 1技术 +1 收起 理由
lxh623 + 1 谢谢!

查看全部评分

发表于 2011-9-30 17:59:53 | 显示全部楼层
我觉得用两个For循环是最快的办法,Findstr属于外部命令启动很慢,不如用两个For循环来的快。

  1. @Echo Off
  2. For /F "tokens=*" %%A In (a.txt) Do (
  3.         For /F "tokens=*" %%B In (tmp.txt) Do (
  4.                 IF /i "%%A" == "%%B" Echo %%A >> b.txt
  5.         )
  6. )
  7. Start b.txt
  8. Pause
复制代码

评分

参与人数 1技术 +1 收起 理由
lxh623 + 1 谢谢!

查看全部评分

发表于 2011-9-30 18:23:29 | 显示全部楼层
回复 8# 冷玉公子


    如果 tmp.txt 稍微大点的话,你的 for 就会比 findstr 慢出很多
发表于 2011-9-30 19:11:24 | 显示全部楼层
回复 9# FOR


    着实的啊,如果文件太大其实用批处理就不是个好的选择。批处理适用用文件数多,但是行数不多。
如果是文件少,行数多就去下载个用C写的文件比较工具,会快很多的。
 楼主| 发表于 2011-10-1 10:09:17 | 显示全部楼层
本帖最后由 lxh623 于 2011-10-1 10:19 编辑

请问楼上两位高手,我这里怎么不行。你们试验过吗?
gawk不是命令,是怎么回事?该批处理没有输出到文本b。
论坛代码怎么总是复制成为一行?
谢谢了!
发表于 2011-10-1 12:37:53 | 显示全部楼层
回复 11# lxh623


去下载一个gawk.exe吧
 楼主| 发表于 2011-10-3 08:27:44 | 显示全部楼层
本帖最后由 lxh623 于 2011-10-3 08:29 编辑
回复  lxh623


去下载一个gawk.exe吧
awk 发表于 2011-10-1 12:37

还是不行。上面的含有gawk的批处理没有输出到文本b。请热心人帮我测试一下。
发表于 2011-10-3 09:02:03 | 显示全部楼层
回复 13# lxh623


你自己加上重定向就行了
  1. # 2>nul&@echo off&cls&gawk -f "%~fs0" a.txt tmp.txt >b.txt&goto :eof
  2. {
  3.         if (NR == FNR) {var[FNR]=$0;i=FNR} else {
  4.                 h=i
  5.                 while (h >= 1){
  6.                         str=match($0,var[h])
  7.                         if (str != 0) print $0
  8.                         h-=1
  9.                 }
  10.         }
  11. }
复制代码

评分

参与人数 1技术 +1 收起 理由
lxh623 + 1 谢谢!终于成功!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 03:07 , Processed in 0.023755 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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