Findstr / g with token或delim

时间:2015-04-05 23:51:32

标签: string batch-file token delimiter findstr

假设我们有2个文件

First.txt

123
456

和Second.txt

789;123
123;def
482;xaq

我需要的是找到第二个文件中的行只包含第一列中第一个文件的条目(标记1,delim;)。 这就是我需要的:

Output.txt的

123;def

当然,

findstr /g:first.txt second.txt

将输出两行:

789;123
123;def

我知道如何将findstr和for / f混合以获得所需的输出? 谢谢!

4 个答案:

答案 0 :(得分:2)

您可以利用findstr的超级限制正则表达式功能,并将first.txt的每一行仅比较每行second.txt的最开头。

@echo off
for /F %%A in (first.txt) do findstr /R /C:"^%%A;" second.txt

/R标志表示搜索字符串应被视为正则表达式。搜索字符串中的^表示%%A位于该行的最开头。 ;是一个字面分号,可防止123行在second.txt中获取1234;abcd

答案 1 :(得分:2)

如果第一列中的所有元素长度相同,那么简单的答案就是

findstr /b /g:first.txt second.txt

但请注意,如果first.txt包含一行12,那么这将匹配第二个文件中的123;abc 129;pqr

答案 2 :(得分:2)

不为每个值执行单独的findstr并避免在行的开头部分匹配的问题,您可以尝试使用

@echo off
    setlocal enableextensions disabledelayedexpansion

    ( cmd /q /c"(for /f "delims=" %%a in (first.txt) do echo(%%a;)" 
    ) | findstr /g:/ /l /b second.txt

它的作用是读取first.txt并用分隔符回显每一行。 findstr使用/g:/检索此输出,以使用标准输入作为要匹配的元素的来源,在行的开头将被视为文字(/l/b文件中的{second.txt}

答案 3 :(得分:0)

是CSV的常规格式。批处理中的注意事项%A变为%% A。

for /f "delims=," %A in (csv.txt) do findstr /c:"%A" file2.txt

这是输出

C:\Users\User>for /f "delims=," %A in (csv.txt) do findstr /c:"%A" csv1.txt

C:\Users\User>findstr /c:"55" csv1.txt
55,61,hi there, Good

C:\Users\User>findstr /c:"60" csv1.txt
54,60,hi there, Bad

C:\Users\User>findstr /c:"Bad" csv1.txt
54,63,hi there, Bad
54,60,hi there, Bad

C:\Users\User>findstr /c:"55" csv1.txt
55,61,hi there, Good

两个文件的内容。

55,60
60,60
Bad,60
55,60

55,61,hi there, Good
54,62,hi there, Good
54,63,hi there, Bad
54,60,hi there, Bad