找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 30848|回复: 7

[文本处理] 【已解决】批处理如何实现对比2个txt后找出匹配的字符然后在后面插入指定内容?

[复制链接]
发表于 2014-8-10 19:45:07 | 显示全部楼层 |阅读模式
本帖最后由 xuexilai 于 2014-8-10 21:27 编辑

麻烦各位哥哥姐姐帮帮忙


根据1.txt里 一七一|65465487  "|"符号前的 字符 如 "一七一"  找出2.txt里匹配相同的 如 "一七一环境"

然后在匹配的字符 "一七一环境" 后面 插入1.txt字符行" |65465487  " 的内容 然后生成3.txt


例子:

1.txt内容如下

稻草|54634667
胜人|65467
一七一|65465487
宇青|56787
datb|57675467
予希|6546876
驼驼|456879789
冲极限|547879
山水风|756867
aimu|435647
hum|546768
锦绣|4356757
路者|765987987
ax|45643545
night|4789798
toread奇笠|67867
汉|678768
凯|456354567
pelliot|7658768
Face|54656
卡侬|5645676
dzr地|68769
马哥|78978
森诺|65477
olar|768989

2.txt内容如下

一七一环境
一七一工人
一七一繁荣
一七一和
datb大概
datb色
驼驼回头人
驼驼富饶
驼驼嫂夫人
aimu工人
aimu似的
在aimu
aimu
hum会议
hum身体
十分hum
路者但是
路者大夫
ax反对
ax士
ax风格
night热
night大会
night后天
night经验

生成 3.txt内容如下

一七一环境|65465487
一七一工人|65465487
一七一繁荣|65465487
一七一和|65465487
datb大概|57675467
datb色|57675467
驼驼回头人|456879789
驼驼富饶|456879789
驼驼嫂夫人|456879789
aimu工人|435647
aimu似的|435647
在aimu|435647
aimu|435647
hum会议|546768
hum身体|546768
十分hum|546768
路者但是|765987987
路者大夫|765987987
ax反对|45643545
ax士|45643545
ax风格|45643545
night热|4789798
night大会|4789798
night后天|4789798
night经验|4789798

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2014-8-10 20:34:14 | 显示全部楼层
  1. @if (0==0) @end/*
  2. @echo off
  3. cscript /e:jscript %0 1.txt 2.txt>3.txt
  4. exit /b */

  5. var fso = new ActiveXObject('Scripting.Filesystemobject')

  6. var ts1 = fso.OpenTextFile(WScript.Arguments(0),1)
  7. var ts2 = fso.OpenTextFile(WScript.Arguments(1),1)

  8. var list=[]
  9. while(!ts1.AtEndOfStream){
  10.         ar = ts1.ReadLine().split(/\|/)
  11.         list.push({name:ar[0],value:'|'+ar[1]})
  12. }
  13. ts1.Close()

  14. var text = ts2.ReadAll().split(/\r?\n/g)
  15. ts2.Close()

  16. for(var i in text){
  17.         var str=text[i]
  18.         for(var j in list){
  19.                 if(str.indexOf(list[j].name)!=-1){
  20.                         str+=list[j].value
  21.                         break
  22.                 }
  23.         }
  24.         WScript.Echo(str)
  25. }
复制代码
发表于 2014-8-10 20:40:09 | 显示全部楼层
来个纯批:
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=" %%a in (2.txt) do (
  3.         set "str=%%a"
  4.         set "FLAG="
  5.         for /f "tokens=1,2 delims=|" %%b in (1.txt) do (
  6.                 if not defined FLAG if "!str:%%b=!" neq "!str!" (
  7.                         set "str=!str!|%%c"
  8.                         set FLAG=1
  9.                 )
  10.         )
  11.         echo !str!
  12. ))>3.txt
复制代码
 楼主| 发表于 2014-8-10 21:27:25 | 显示全部楼层
回复 3# CrLf


    麻烦了哥哥 谢谢你
发表于 2014-8-10 23:31:28 | 显示全部楼层
再来个perl
  1. open(IN,'1.txt');
  2. @text=<IN>;
  3. close(IN);

  4. foreach (@text){
  5.         chop();
  6.         @ar=split(/\|/,$_);
  7.         $list{@ar[0]}='|'.@ar[1];
  8. }

  9. open(IN,'2.txt');
  10. while(chop($line=<IN>)){
  11.         foreach (keys %list){
  12.                 if (index($line,$_)>=0) {
  13.                         $line .= $list{$_};
  14.                         break;
  15.                 }
  16.         }
  17.         print $line ."\r\n";
  18. }
  19. close(IN);
复制代码
发表于 2014-8-11 00:17:40 | 显示全部楼层
  1. my %hash;
  2. my @arr;
  3. my $j;
  4. foreach ( &loadf("1.txt") ) {
  5.         $hash{$1}=$2 if /(.*)\|(.*)\n/;
  6. }

  7. open WRT,">:raw:crlf","3.txt" or warn "$!";
  8. foreach ( &loadf("2.txt") ) {
  9.         foreach $j (keys %hash) {
  10.                 if (/^$j/) {
  11.                         s/\n?$/\|$hash{$j}\n/;
  12.                         print WRT $_;
  13.                 }
  14.         }
  15. }
  16. close WRT;

  17. sub loadf {
  18.         open READ,"<:raw:crlf", shift or warn "$!";
  19.         @all=<READ>;
  20.         close READ;
  21.         return @all;
  22. }
复制代码

评分

参与人数 1技术 +1 收起 理由
CrLf + 1

查看全部评分

发表于 2014-8-11 00:58:04 | 显示全部楼层
回复 6# 523066680


    正则里也可以用 $j 啊...
    断断续续看 perl语言入门 学习中,有的用法貌似没见过
发表于 2014-8-11 08:47:22 | 显示全部楼层
本帖最后由 523066680 于 2014-8-11 08:55 编辑

回复 7# CrLf


    可以代入,不过有些情况比如 $j里面带有"\" ,后面的单个字符会被转义,尤其路径匹配可能出错。
有个\Q \E 可以作为绝对引用,这个用法是我看Perl教程的时候看漏了,在CU别人告诉我的,这里提一下。

参考: http://bbs.chinaunix.net/thread-4131501-1-1.html



─────┐
jason680  │
─────┘
─────────────┐
回复 1# 523066680         │
                          │
quotemeta or \Q           │
(perldoc -f quotemeta)    │
                          │
$str2 = quotemeta($str2)  │
or                        │
s/\Q$str2//               │
s/\Q$str2\E//             │
─────────────┘

评分

参与人数 1技术 +1 收起 理由
CrLf + 1 嗯,是要小心了

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-21 06:37 , Processed in 0.025536 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表