2015-04-05 3 views
0

Предположим, у нас есть 2 файлаFindstr/г с лексема или DELIM

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 и для/f для получения нужного выхода? Спасибо!

ответ

2

Если все элементы первого столбца имеют одинаковую длину, то простой ответ был бы

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

Однако обратите внимание, что если first.txt содержит строку 12, то это будет соответствовать 123;abcи129;pqr во втором файле.

+0

Хмм большое нахождение. На самом деле ваше решение работает на любую длину. Только то, что мне нужно –

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 
+0

Может вам быть более явным? Я попробовал вашу команду, но я получаю тот же результат '789; 123' ' 123; def'. Спасибо! –

+0

Это не файлы CSV; они просто в аналогичном формате. Этот парень имеет значения с разделителями с запятой, поэтому он должен быть «delims =;» вместо этого. – SomethingDark

+0

Это пример для вас, чтобы поменять его. – Serenity

2

Вы можете воспользоваться супер ограниченные возможности регулярных выражений в findstr и сравнить каждую строку first.txt только в самом начале каждой строки second.txt.

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

/R флаг означает, что строка поиска должна рассматриваться как регулярное выражение. ^ в строке поиска означает, что %%A приходит в самом начале строки. ; - это буквальная точка с запятой, которая предотвратит выделение линии 1234;abcd в файле second.txt.

+0

отредактировал его как^%% A .; в соответствии с моими потребностями. Кажется, работает как ожидалось. Большое вам спасибо –

1

без выполнения отдельного 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 файле

+0

Очень приятно. Я думаю, что это первый раз, когда я когда-либо видел '/', используемый с опцией '/ G'! – dbenham

+0

похоже работает. Тем не менее, работа для точной длины в обоих файлах –