查找重复项数并批量复制该行
Look for number of duplicates and copy the line in batch
在File_1中我有:
Word_1;ger
Word_1;gr
Word_1;greber
Word_1;gaerfsd
Word_2;gerbhge
Word_2;tgbzrfvd
Word_3;gzfdfdc
然后我想计算每行第一列的重复数,根据重复数(一个或不同),我将把它们复制粘贴到两个不同的文件中。
File_2 将包含:
Word_3;gzfdfdc
File_3 将包含:
Word_1;ger
Word_1;gr
Word_1;greber
Word_1;gaerfsd
Word_2;gerbhge
Word_2;tgbzrfvd
这是我写的代码:
setlocal EnableDelayedExpansion
(for /f "tokens=1-2 delims=;" %%a in (File_1) do (
set current_line=%%a
if "!current_line!" NEQ "!previous_line!" (
for /f %%C in ('Find /C %%a ^< File_1) do (
set Count=%%C
if "!Count!==1" (
findstr %%a File_1 >>File_2
)
if not "!Count!==1" (
findstr %%a File_1 >>File_3
)
)
)
set previous_line=!current_line!
)
好像不行。任何帮助?
删除了不需要的变量,更正了错误的 if
语法并为 "best practice" 添加了一些引号。似乎完全符合您的意图:
setlocal EnableDelayedExpansion
(for /f "tokens=1-2 delims=;" %%a in (File_1.txt) do (
if "%%a" NEQ "!previous_line!" (
for /f %%C in ('Find /C "%%a" ^< File_1.txt') do (
if "%%C"=="1" (
findstr "%%a" File_1.txt >>File_2.txt
) else (
findstr "%%a" File_1.txt >>File_3.txt
)
)
)
set "previous_line=%%a"
))
尽管您的(更正后的)代码工作正常,但效率很低。您对每组重复项 执行 findstr
命令两次 。如果输入文件很大,此方法可能会花费很多时间。
您可能会通过一次 for /F
传递文件得到相同的结果,而不使用 findstr
:
@echo off
setlocal EnableDelayedExpansion
del File_2.txt File_3.txt 2>NUL
set "last1="
set "moreThanOne="
for /f "tokens=1-2 delims=;" %%a in (File_1.txt) do (
if "%%a" equ "!last1!" (
>> file_3.txt echo !last1!;!last2!
set "moreThanOne=1"
) else (
if defined moreThanOne (
>> file_3.txt echo !last1!;!last2!
) else if defined last1 (
>> file_2.txt echo !last1!;!last2!
)
set "moreThanOne="
)
set "last1=%%a"
set "last2=%%b"
)
if defined moreThanOne (
>> file_3.txt echo !last1!;!last2!
) else (
>> file_2.txt echo !last1!;!last2!
)
在File_1中我有:
Word_1;ger
Word_1;gr
Word_1;greber
Word_1;gaerfsd
Word_2;gerbhge
Word_2;tgbzrfvd
Word_3;gzfdfdc
然后我想计算每行第一列的重复数,根据重复数(一个或不同),我将把它们复制粘贴到两个不同的文件中。
File_2 将包含:
Word_3;gzfdfdc
File_3 将包含:
Word_1;ger
Word_1;gr
Word_1;greber
Word_1;gaerfsd
Word_2;gerbhge
Word_2;tgbzrfvd
这是我写的代码:
setlocal EnableDelayedExpansion
(for /f "tokens=1-2 delims=;" %%a in (File_1) do (
set current_line=%%a
if "!current_line!" NEQ "!previous_line!" (
for /f %%C in ('Find /C %%a ^< File_1) do (
set Count=%%C
if "!Count!==1" (
findstr %%a File_1 >>File_2
)
if not "!Count!==1" (
findstr %%a File_1 >>File_3
)
)
)
set previous_line=!current_line!
)
好像不行。任何帮助?
删除了不需要的变量,更正了错误的 if
语法并为 "best practice" 添加了一些引号。似乎完全符合您的意图:
setlocal EnableDelayedExpansion
(for /f "tokens=1-2 delims=;" %%a in (File_1.txt) do (
if "%%a" NEQ "!previous_line!" (
for /f %%C in ('Find /C "%%a" ^< File_1.txt') do (
if "%%C"=="1" (
findstr "%%a" File_1.txt >>File_2.txt
) else (
findstr "%%a" File_1.txt >>File_3.txt
)
)
)
set "previous_line=%%a"
))
尽管您的(更正后的)代码工作正常,但效率很低。您对每组重复项 执行 findstr
命令两次 。如果输入文件很大,此方法可能会花费很多时间。
您可能会通过一次 for /F
传递文件得到相同的结果,而不使用 findstr
:
@echo off
setlocal EnableDelayedExpansion
del File_2.txt File_3.txt 2>NUL
set "last1="
set "moreThanOne="
for /f "tokens=1-2 delims=;" %%a in (File_1.txt) do (
if "%%a" equ "!last1!" (
>> file_3.txt echo !last1!;!last2!
set "moreThanOne=1"
) else (
if defined moreThanOne (
>> file_3.txt echo !last1!;!last2!
) else if defined last1 (
>> file_2.txt echo !last1!;!last2!
)
set "moreThanOne="
)
set "last1=%%a"
set "last2=%%b"
)
if defined moreThanOne (
>> file_3.txt echo !last1!;!last2!
) else (
>> file_2.txt echo !last1!;!last2!
)