Search code examples
batch-filemultiple-columnsfindstr

Findstr based on column1 only [batch file]


I have been searching through StackOverflow but could not find an answer that hits the mark. I have 2 .txt files to compare and return a 3rd one where differences exist.

However, only the first column of the first 2 files need a comparison.

E:\Compare_flie\file_1.txt

GND ZERO
22XC44    XXYYZZ
33XC55    YYUUTT

E:\Compare_file\file_2.txt

GND ZERO
22XC44    KK77UU
33XC55    88JJ66
66NN77    HHOO99
99CC88    UU77RR

E:\Compare_file\file_3.txt (intended output)

66NN77    HH0099
99CC88    UU77RR

Tried the code below but it is only good at picking out the differences of all the strings in the line

%echo on
findstr /v /i /g:E:\Compare_files\file_1.txt E:\Compare_files\file_2.txt 
> E:\Compare_files\file_3.txt

Refined it further but not hitting the mark yet.

%echo on
for /f "tokens=1 delims= " %%I in ("E:\Compare_files\file_1.txt") do 
findstr /v /i "%%I"/g:"D:\Compare_files\file_2.txt" 
> "D:\Compare_files\file_3.txt"

Appreciate if anyone can assist.


Solution

  • @ECHO OFF
    SETLOCAL
    SET "sourcedir=U:\sourcedir"
    SET "destdir=U:\destdir"
    SET "filename1=%sourcedir%\q48816766.txt"
    SET "filename2=%sourcedir%\q48816766_2.txt"
    SET "tempfile=%temp%\q48816766.tmp"
    SET "outfile=%destdir%\outfile.txt"
    (FOR /f "usebackq" %%a IN ("%filename1%") DO ECHO %%a )>"%tempfile%"
    FINDSTR /b /v /g:"%tempfile%" "%filename2%">"%outfile%"
    REM DEL "%tempfile%" /F /Q
    
    GOTO :EOF
    

    I've set up names to suit my system, but with the two files containing your data.

    Obviously, the usebackq on the for/f is only required if the filename is quoted. The parentheses around the command permit the echoed output to be accumulated into the temporary file. What's important here is the space between the %%a and ). This ensures that the temporary file contains trailing spaces.

    Then apply the temporary file to the second data file via /g as in OP's code. The presence of the trailing spaces in the tempfile ensure that the only lines selected for omission are those where the first column exactly matches so for instance had 66NN7 appeared in the first file, first column, then this would not match 66NN77 in the second file.