标题: [文本处理] [求助]批处理只要有相同内容,就保留那一行 [打印本页]
作者: jrx401 时间: 2020-2-6 09:40 标题: [求助]批处理只要有相同内容,就保留那一行
详细如下;
A.txt内容;
11111
CCCCC
B.txt内容;
aa bb D1111
1ac bhy 11111
15c b6y 11112
1ac b8y A1111
2ac 9bhy 11111
75c b6y CCCCC
15c c6y 11111
处理后C.txt【只保留A里有,B内容里 第3列一致的 行】;
1ac bhy 11111
2ac 9bhy 11111
75c b6y CCCCC
15c c6y 11111
如下code是可以处理,但是A.txt, B.txt里面有1万行时,就耗时20分钟。
可否有快速处理的方法呢?
使用的code;- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=1,2,3 delims= " %%c in (B.txt) do (
- findstr /c:"%%h" A.txt>nul&&echo %%c %%d %%e
- ))>C.txt
- endlocal
复制代码
还请高手指点。
感谢
作者: flashercs 时间: 2020-2-6 11:39
- @echo off
- pushd "%~dp0"
- set "fileA=A.txt"
- set "fileB=B.txt"
- set "fileC=C.txt"
- findstr /elg:"%fileA%" "%fileB%">"%fileC%"
- popd
- pause
- exit /b
复制代码
作者: flashercs 时间: 2020-2-6 12:39
精确查找- @echo off
- REM 在fileB中查找行which-第三列包含于fileA中-保存到fileC
- if not "%~1"=="" goto print
- pushd "%~dp0"
- set fileA="A.txt"
- set fileB="B.txt"
- set fileC="C.txt"
- setlocal EnableDelayedExpansion
- for /f "usebackq tokens=1 delims=" %%A in (%fileB%) do (
- set /a "n+=1"
- set "#!n!=%%A"
- )
- >%fileC% (
- for /f "tokens=1 delims=:" %%A in ('"%0 %fileB%|findstr /nlxg:%fileA%"') do (
- echo !#%%A!
- )
- )
- endlocal
- popd
- pause
- exit /b
-
- :print
- for /f "usebackq tokens=3" %%a in ("%~1") do (
- echo %%a
- )
- exit /b
复制代码
作者: jrx401 时间: 2020-2-6 13:08
回复 2# flashercs
感谢大侠。
测试结果,C.txt 是空的。
作者: jrx401 时间: 2020-2-6 13:11
回复 3# flashercs
感谢大侠。
测试结果,C.txt 也是空的。
作者: Gin_Q 时间: 2020-2-6 13:41
如果A里面有B里面没有就不用写入C里面了吧!
作者: Gin_Q 时间: 2020-2-6 13:44
B里面的格式是否都是空格分割的?是否只需要匹配第三列的内容?
作者: jrx401 时间: 2020-2-6 13:53
回复 7# Gin_Q
B里面的格式是否都是空格分割的?
->有些是间隔符
是否只需要匹配第三列的内容?
->是的
作者: jrx401 时间: 2020-2-6 13:54
如果A里面有B里面没有就不用写入C里面了吧!
Gin_Q 发表于 2020-2-6 13:41
如果A里面有B里面没有的行 就不用写入C里面。
作者: flashercs 时间: 2020-2-6 14:25
回复 5# jrx401
那你下载试试
作者: went 时间: 2020-2-6 16:06
本帖最后由 went 于 2020-2-6 16:08 编辑
- @echo off
- set "pattern="
- for /f "delims=" %%i in (A.txt) do call set "pattern=%%pattern%%.*%%i$ "
- type "B.txt" | findstr "%pattern%" > "C.txt"
- pause
复制代码
确保你的第三列是最后一列
作者: Gin_Q 时间: 2020-2-6 16:47
C语言写的,以下是源代码:- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #define MAX 2048
- void ch(char *);
- int star(char *b,FILE *a);
- int main(int argc,char *argv[3])
- {
- /*设置路径
- char *Path_a="C:\\Users\\Cool_Breeze\\Desktop\\gin\\test\\a.txt";
- char *Path_b="C:\\Users\\Cool_Breeze\\Desktop\\gin\\test\\b.txt";
- char *Path_c="C:\\Users\\Cool_Breeze\\Desktop\\gin\\test\\c.txt";
- */
- //打开文件
- FILE *fp_a,*fp_b,*fp_c;
- char a[MAX],b[MAX],c[MAX];
- if ((fp_a=fopen(*(argv+1),"r"))==NULL)
- {
- printf("%s 打开失败!",*(argv+1));
- return 0;
- }
- if ((fp_b=fopen(*(argv+2),"r"))==NULL)
- {
- printf("%s 打开失败!",*(argv+2));
- return 0;
- }
- if ((fp_c=fopen(*(argv+3),"w"))==NULL)
- {
- printf("%s 打开失败!",*(argv+3));
- return 0;
- }
- while(fgets(b,MAX,fp_b)!=NULL)
- {
- if (star(b,fp_a)==1) //写入
- {
- fprintf(fp_c,"%s",b);
- }
- }
- fclose(fp_a);
- fclose(fp_b);
- fclose(fp_c);
- return 0;
- }
- int star(char *b,FILE *a)
- {
- char b_s[MAX]; //储存第三列字符串
- char *c=b_s;
- int d=0,n=0;
- while (*(b+n++) != '\0')
- {
- if (*(b+n) == ' ')
- {
- d++;
- if (d==2) //出现第二个分隔符后拷贝第三列字符串
- {
- strncpy(c,b+n+1,MAX); //拷贝
- ch(c);
- goto A;
- }
- }
-
- }
- A:
- char temp[MAX]="0";
- fseek(a,0,SEEK_SET); //恢复文件指针
- while(fgets(temp,MAX,a)!=NULL)
- {
- ch(temp);
- if (strncmp(temp,c,MAX)==0) //比较字符串
- {
- return 1; //一样返回1
- }
- }
- return 0; //不一样返回0
- }
- void ch(char *old)
- {
- char sta;
- do
- {
- sta=*(old++);
- if (sta == '\n' || sta == '\r')
- {
- old[strlen(old)-1]='\0'; //去掉换行符
- }
- }while(sta);
- }
复制代码
作者: Gin_Q 时间: 2020-2-6 16:52
你加入微信群没有?
作者: Batcher 时间: 2020-2-7 10:14
回复 1# jrx401
推荐试试 gawk 这个命令行工具- gawk "NR==FNR{a[$1]=$1}NR>FNR{if($3 in a)print}" "A.txt" "B.txt" > "C.txt"
复制代码
http://bcn.bathome.net/s/tool/index.html?key=gawk
作者: Gin_Q 时间: 2020-2-7 12:11
行不行给个话呗!我想看看处理速度怎么样?
作者: jrx401 时间: 2020-2-7 17:50
确保你的第三列是最后一列
went 发表于 2020-2-6 16:06
感谢大虾,
高手!!!缩短到 5s 以内 。
作者: jrx401 时间: 2020-2-7 17:51
回复 11# went
高手!!!
缩短到5s以内
作者: jrx401 时间: 2020-2-7 17:52
回复 10# flashercs
可以了,敢虾高手。
作者: jrx401 时间: 2020-2-7 17:58
回复 12# Gin_Q
敢虾大虾协助。
但是 c.txt结果 里面空值。
作者: Gin_Q 时间: 2020-2-8 09:29
回复 19# jrx401
把你的文本发出来看看吧?
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |