[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

本帖最后由 lxh623 于 2011-9-30 21:55 编辑

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

评分人数

    • CrLf: 感谢给帖子标题标注[已解决]字样PB + 2

但是,刚才用文本a的任意一行试验,得到的不是精确匹配(我想要的)。而用文本a(含有五十行)不出来任何结果。
如果您有空,麻烦您下载QQ文件,帮我看看。
http://hz.ftn.qq.com/ftn_handler ... 7859a86aa04b2ddca98

TOP

哪个帖子说它是精确匹配?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

哪个帖子说它是精确匹配?
Batcher 发表于 2011-9-27 00:16

谢谢您!
http://www.bathome.net/viewthread.php?tid=11244

TOP

加个 /l 试试,不过/g 开关有 bug,有时候…

TOP

加个 /l 试试,不过/g 开关有 bug,有时候…
CrLf 发表于 2011-9-27 08:34

谢谢!怎样加?

TOP

本帖最后由 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

评分人数

TOP

我觉得用两个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

评分人数

TOP

回复 8# 冷玉公子


    如果 tmp.txt 稍微大点的话,你的 for 就会比 findstr 慢出很多

TOP

回复 9# FOR


    着实的啊,如果文件太大其实用批处理就不是个好的选择。批处理适用用文件数多,但是行数不多。
如果是文件少,行数多就去下载个用C写的文件比较工具,会快很多的。

TOP

本帖最后由 lxh623 于 2011-10-1 10:19 编辑

请问楼上两位高手,我这里怎么不行。你们试验过吗?
gawk不是命令,是怎么回事?该批处理没有输出到文本b。
论坛代码怎么总是复制成为一行?
谢谢了!

TOP

回复 11# lxh623


去下载一个gawk.exe吧

TOP

本帖最后由 lxh623 于 2011-10-3 08:29 编辑
回复  lxh623


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

还是不行。上面的含有gawk的批处理没有输出到文本b。请热心人帮我测试一下。

TOP

回复 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

评分人数

    • lxh623: 谢谢!终于成功!技术 + 1

TOP

返回列表