Board logo

标题: [文本处理] [已解决]批处理怎样提取文本中含有特定文字的行? [打印本页]

作者: lxh623    时间: 2011-9-26 23:29     标题: [已解决]批处理怎样提取文本中含有特定文字的行?

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

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

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

哪个帖子说它是精确匹配?
作者: lxh623    时间: 2011-9-27 07:43

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

谢谢您!
http://www.bathome.net/viewthread.php?tid=11244
作者: CrLf    时间: 2011-9-27 08:34

加个 /l 试试,不过/g 开关有 bug,有时候…
作者: lxh623    时间: 2011-9-27 16:54

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

谢谢!怎样加?
作者: FOR    时间: 2011-9-30 17:19

本帖最后由 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. }
复制代码

作者: 冷玉公子    时间: 2011-9-30 17:59

我觉得用两个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
复制代码

作者: FOR    时间: 2011-9-30 18:23

回复 8# 冷玉公子


    如果 tmp.txt 稍微大点的话,你的 for 就会比 findstr 慢出很多
作者: 冷玉公子    时间: 2011-9-30 19:11

回复 9# FOR


    着实的啊,如果文件太大其实用批处理就不是个好的选择。批处理适用用文件数多,但是行数不多。
如果是文件少,行数多就去下载个用C写的文件比较工具,会快很多的。
作者: lxh623    时间: 2011-10-1 10:09

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

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

回复 11# lxh623


去下载一个gawk.exe吧
作者: lxh623    时间: 2011-10-3 08:27

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


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

还是不行。上面的含有gawk的批处理没有输出到文本b。请热心人帮我测试一下。
作者: awk    时间: 2011-10-3 09:02

回复 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. }
复制代码





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