Board logo

标题: 【已解决】批处理根据文本保留重复的行 [打印本页]

作者: bestcom    时间: 2023-12-18 06:47     标题: 【已解决】批处理根据文本保留重复的行

本帖最后由 bestcom 于 2023-12-19 06:35 编辑

论坛太牛B了。
具体报酬:50元人民币。
支付方式:支付宝,微信
系统: win7
具体内容:根据b.txt保留重复
需求:
有两个文本,要求保留重复行,生成新文本
a.txt
1234|张三|男|爱好
4560|李四|男|爱好
327|张二|女|性别
12678|王五|男|爱好
54804|赵氏|男|爱好

b.txt
1234
327
保留的结果为
1234|张三|男|爱好
327|张二|女|性别

不是大文本,最多二三百行内容的
作者: wanghan519    时间: 2023-12-18 07:09

本帖最后由 wanghan519 于 2023-12-18 07:13 编辑

在busybox-w32里大概
用gawk需要改引号
  1. awk -F '|' 'NR==FNR{d[$0]=1;next}{if($1 in d){print}}' b.txt a.txt > c.txt
复制代码

作者: bestcom    时间: 2023-12-18 07:49

回复 2# wanghan519


    你好,可以教一下使用吗,我是WIN7系统。
作者: ShowCode    时间: 2023-12-18 10:03

回复 1# bestcom


V1.bat
  1. @echo off
  2. set "FileA=a.txt"
  3. set "FileB=b.txt"
  4. set "FileC=c.txt"
  5. cd /d "%~dp0"
  6. (for /f "tokens=1* delims=|" %%a in ('type "%FileA%"') do (
  7.     findstr /b /e "%%a" "%FileB%" >nul 2>&1
  8.     if not errorlevel 1 (
  9.         echo %%a^|%%b
  10.     )
  11. ))>"%FileC%"
复制代码

作者: qixiaobin0715    时间: 2023-12-18 10:42

  1. findstr /l /g:b.txt a.txt>c.txt
复制代码

作者: ShowCode    时间: 2023-12-18 11:10

回复 5# qixiaobin0715


假设b.txt里面有一行123
它会匹配到a.txt里面的1234|张三|男|爱好
看起来不像是楼主想要的结果
作者: qixiaobin0715    时间: 2023-12-18 11:19

回复 6# ShowCode
是的,确实存在这个漏洞。
作者: bestcom    时间: 2023-12-18 14:49

回复 6# ShowCode


    这论坛太赞了。很快就找到解决方法了。
上面两位老兄的代码,我都试过了,都好用。

最后这位老兄的代码,确实存在这问题,但我b.txt的文件基本都是唯一性,所以这代码对我来说,完全也够用的。
作者: qixiaobin0715    时间: 2023-12-18 14:50

本帖最后由 qixiaobin0715 于 2023-12-19 10:56 编辑
  1. @echo off
  2. for /f "delims=" %%i in (b.txt) do set _"%%i"=true
  3. (for /f "tokens=1* delims=|" %%i in (a.txt) do (
  4.     if defined _"%%i" (
  5.         if "%%j"=="" (
  6.             echo,%%i
  7.         ) else (
  8.             echo,%%i^|%%j
  9.         )
  10.     )
  11. ))>c.txt
复制代码

作者: qixiaobin0715    时间: 2023-12-18 15:07

回复 4# ShowCode
实际上代码都会有这样或那样的条件限制,比如你4楼的代码:
假设b.txt里面有12或3而不存在12 3
它就会匹配到a.txt里面的 12 3|张三|男|爱好
作者: ShowCode    时间: 2023-12-18 15:18

回复 10# qixiaobin0715


    不能同意更多了,能解决问题就好。
作者: aloha20200628    时间: 2023-12-19 11:43

本帖最后由 aloha20200628 于 2023-12-19 11:46 编辑


从本帖的议论可看出一些findstr的用法趣点》

一。findstr /g:"b.txt" a.txt 句式表明用b.txt中的每行作为关键词,去匹配a.txt中包含该关键词的所有行。
如果使用 /L 参数,则会关闭默认的正则匹配功能,而采用关键词的字面量匹配。
      因此,一楼的求助目标,其实并非要保留两个文件的重复行,而是a.txt中包含b.txt中所列关键词的所有行。

二。findstr /xg:"b.txt" a.txt 句式中采用 /x 参数,表明用b.txt中的每行去匹配a.txt中与之全行匹配的所有行,而无须采用 /b 或 /e 参数。

另外关于用文本行数据作为变量名的匹配方法,效率确实很爽,但要避开大小写英文字符的陷阱,否则有可能遭遇因“大小写混同”而导致的失误。

作者: W.w    时间: 2023-12-19 21:59

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=276865&ptid=68084]9#[/url] [i]qixiaobin0715[/i] [/b]


@echo off
for /f "delims=" %%i in (b.txt) do set "_%%i=true"
(for /f "tokens=1* delims=|" %%i in (a.txt) do (
    if defined _%%i (
        if "%%j"=="" (
            echo %%i
        ) else (
            echo %%i^|%%j
        )
    )
)) > c.txt




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