Board logo

标题: [文本处理] [已解决]批处理如何在一个列表中找另一个列表中存在的? [打印本页]

作者: gcbgczhang    时间: 2020-11-21 18:36     标题: [已解决]批处理如何在一个列表中找另一个列表中存在的?

本帖最后由 gcbgczhang 于 2021-7-31 14:19 编辑

请老师各位老师一个问题,
aaa.txt内容
aaasssss
aass11
ddssaa
ss00
bbbbb
...
bbb.txt内容
aaasssss
aass111
ddssaa
ss000
bbbbb

...
想实现的:严格按aaa内容每行到bbb里去找,找到了就输入ccc.txt,找不到就空一行。
得到的ccc.txt内容如下
aaasssss

ddssaa

bbbbb
...
谢谢各位老师啦
作者: gcbgczhang    时间: 2020-11-21 18:59

@echo off
setlocal enabledelayedexpansion
for /f %%i in (aaa.txt) do (
findstr "%%i" bbb.txt >>ccc.txt & findstr "%%i" bbb.txt || echo. >>ccc.txt
)
echo 完成
pause
我这个不能处理ss00与ss000的绝对匹配,有什么方法可以将%%i比较一下findstr "%%i" bbb.txt完全相相等再输出呢,
作者: Batcher    时间: 2020-11-21 19:06

回复 1# gcbgczhang
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "delims=" %%i in ('type "aaa.txt"') do (
  4.     set /p str=
  5.     if "%%i" equ "!str!" (
  6.         echo,%%i
  7.     ) else (
  8.         echo,
  9.     )
  10. ))<"bbb.txt" >"ccc.txt"
复制代码

作者: Batcher    时间: 2020-11-21 19:08

回复 2# gcbgczhang


findstr命令使用某些参数可以实现精确匹配,参考:
http://bbs.bathome.net/thread-24-1-1.html
http://bbs.bathome.net/thread-14682-1-1.html

但是不建议在你这个代码里面使用,因为 for 循环内部重复调用 findstr 命令会让代码执行效率变得比较差。
作者: qixiaobin0715    时间: 2020-11-22 07:11

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in (bbb.txt) do set "#%%i=true"
  4. (for /f "delims=" %%i in (aaa.txt) do (
  5.     if defined #%%i (
  6.         echo,%%i
  7.     ) else (
  8.         echo,
  9.     )
  10. ))>ccc.txt
复制代码

作者: gcbgczhang    时间: 2020-11-23 10:34

回复 3# Batcher


     是啊,我有几个用了finstr 加for ,超级慢,因为我有30万条数据
作者: Batcher    时间: 2020-11-23 11:01

回复 6# gcbgczhang


    试试3楼、5楼代码分别需要多少时间吧,如果需要进一步优化再继续讨论。
作者: terse    时间: 2020-11-25 14:03

直接finstr  不加for




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