标题: 【已解决】批处理根据文本保留重复的行 [打印本页]
作者: 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需要改引号- 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- @echo off
- set "FileA=a.txt"
- set "FileB=b.txt"
- set "FileC=c.txt"
- cd /d "%~dp0"
- (for /f "tokens=1* delims=|" %%a in ('type "%FileA%"') do (
- findstr /b /e "%%a" "%FileB%" >nul 2>&1
- if not errorlevel 1 (
- echo %%a^|%%b
- )
- ))>"%FileC%"
复制代码
作者: qixiaobin0715 时间: 2023-12-18 10:42
- 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 编辑
- @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
复制代码
作者: 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 |