【问题标题】:Remove lines from file1 that exist in file2 in Powershell从 Powershell 中的 file2 中删除 file1 中的行
【发布时间】:2023-04-03 17:53:01
【问题描述】:

我有一个 file1.txt,其中包含:

第一行
第2行
第3行
第4行

我想从 file1.txt 中删除另一个 file2.txt 中存在的所有行:

第3行
第2行

结果应该是:

第一行
第 4 行

我尝试使用此命令,但仅当我在 file2.txt 中有一行时它才有效:

Get-Content C:\file1.txt | Where-Object {$_ -notmatch $(get-content C:\file2.txt)} 

注意:我不想比较两个文件是否相同。

有什么想法吗?我对 powershell 很陌生。

【问题讨论】:

  • 使用-in 而不是-match,在这里的答案中解释了几乎相同的事情:stackoverflow.com/questions/39307707/…
  • 顺便说一句,为了更快地学习 PS,使用 PowerShell ISE,您可以在其中调试代码并在任何关键字上按 F1 以查看内置帮助(注意它不像在线文章那样完整,有时它会显示控制台中匹配主题的列表,在这种情况下选择一个并再次按 F1)。

标签: windows file powershell


【解决方案1】:

接下来的代码 sn-p 展示了两种不同的方式来实现相同的结果:

$filebefore="$env:TEMP\beforerestart.txt"    # change to match your circumstances
$file_after="$env:TEMP\after_restart.txt"    # ditto

### Compare-Object way
$array = Compare-Object $(Get-Content $filebefore) $(Get-Content $file_after)
$array | where {$_.SideIndicator -eq "<="} | 
              Format-Table -Property InputObject -AutoSize -HideTableHeaders

### -NotIn operator way
$(Get-Content $filebefore) | 
     Where-Object {$_ -notIn $(Get-Content $file_after)} 

【讨论】:

  • -NotIn 方式适合我的情况!谢谢!但是当行包含重音字符时它不起作用......有什么提示吗?
  • @Pozinux 请阅读Get-Content for FileSystem,为-Encoding 参数使用适当的值。
  • 找到了解决方案!非常感谢您的快速答复。
【解决方案2】:

Compare-Object 有利于获取两个文件之间的差异。这是一些示例代码来完成您所要求的。

$file1 = Get-Content C:\temp\file1.txt
$file2 = Get-Content C:\temp\file2.txt
$Diff = Compare-Object $File1 $File2
$LeftSide = ($Diff | Where-Object $_.SideIndicator -eq '<=').InputObject
$LeftSide | Set-Content C:\temp\file3.txt

【讨论】:

  • 我收到以下错误:Where-Object : Cannot bind argument to parameter 'FilterScript' because it is null. 有什么想法吗?
猜你喜欢
  • 2017-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多