繁体   English   中英

如何从Windows命令shell中的文件B中删除文件A中的行?

[英]How to remove lines from File A that are in File B in Windows command shell?

这个问题非常适合加入两个文件。 我需要做相反的事情。 我需要从文件A中删除文件A中的行。

这个问题与其他问题类似,不过该问题适用于unix,这适用于windows命令shell(cmd.exe)。

我想使用Windows 7 Pro原生的工具。

更新:

这些文件是主机文件。 每一行都包含以下内容:

  • 127.0.0.1 host.domain.com

要么

  • 0.0.0.0 host.domain.com

要么

  • # this is a comment

文件最多可包含200,000行。 可能存在空格和制表符。

虽然我更喜欢保留它,但顺序不会影响功能。

以下是主机文件的一些示例:

(对于这个问题,不要担心0.0.0.0 vs'127.0.0.1`。)

findstr /v /x /g:"fileb" "filea">resultfile

查找文件A中的字符串( /v )与fileb字符串完全匹配( /x )。

您没有为此问题提供单一规范! 这些文件可能有特殊字符或空格吗? 他们可能有多少行? 输出文件必须与FileA的顺序相同吗?

根据一系列因素,此解决方案可能有效,也可能无效

@echo off
setlocal

rem Load lines from File A into "fileA" array
for /F "delims=" %%a in (FileA.txt) do set "fileA["%%a"]=1"

rem Remove elements from "fileA" array that are in File B
for /F "delims=" %%b in (FileB.txt) do set "fileA["%%b"]="

rem Show remaining elements
for /F "tokens=2 delims=[]" %%a in ('set fileA[') do echo(%%~a

正如dbenham评论中指出的那样,有一个带有多个文字搜索字符串的findstr的错误 - 引用这个帖子: 为什么这个带有多个文字搜索字符串的FINDSTR示例找不到匹配? 要解决此问题,您可以在命令提示符中执行以下操作:

copy "fileB" "fileC" & (for /F usebackq^ delims^= eol^= %L in ("fileA") do findstr /V /X /C:"%L" "fileC" > "fileC") & move /Y "fileC" "fileB"

或者在批处理文件中:

copy "fileB" "fileC"
for /F usebackq^ delims^= eol^= %%L in ("fileA") do (
    findstr /V /X /C:"%%L" "fileC" > "fileC"
)
move /Y "fileC" "fileB"

该第一拷贝fileB作为fileC ,然后删除线fileC匹配的那些fileA一个接着一个,则替换原始fileB由修改fileC

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM