5

I have a file1.txt which contains:

line1
line2
line3
line4

I want to remove from file1.txt all the lines which exist in another file2.txt:

line3
line2

The result should be :

line1
line4

I tried to use this command but it works only if I have one line in file2.txt :

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

Note : I don't want to compare 2 files to see if they are the same.

Any idea? I'm pretty new to powershell.

Pozinux
  • 964
  • 2
  • 10
  • 22
  • 2
    Use `-in` instead of `-match`, explained in the answers here of almost the same thing: http://stackoverflow.com/questions/39307707/how-to-match-source-files-in-multiple-subdirectories-with-a-list-and-then-copy-t/39309746 – TessellatingHeckler Sep 05 '16 at 22:09
  • 4
    BTW to learn PS faster, use PowerShell ISE where you can debug the code and press F1 on any keyword to view the built-in help (beware it's not as complete as online articles and sometimes it shows a list of matching topics in the console, in that case select one and press F1 again). – wOxxOm Sep 05 '16 at 22:12

2 Answers2

6

Next code snippet shows two different ways to achieve the same result:

$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)} 
InteXX
  • 6,135
  • 6
  • 43
  • 80
JosefZ
  • 28,460
  • 5
  • 44
  • 83
  • the -NotIn way is the one for my case! Thanks! But it doesn't work when lines contain accent caracteres... Any hint ? – Pozinux Sep 06 '16 at 14:08
  • @Pozinux please read [`Get-Content` for FileSystem](https://technet.microsoft.com/en-us/library/hh847788.aspx), use appropriate value for `-Encoding` parameter. – JosefZ Sep 06 '16 at 14:28
  • Found the solution! Thanks so much for your quick anwser. – Pozinux Sep 06 '16 at 15:27
4

Compare-Object is good for getting the difference between two files. Here is some sample code to accomplish what you have asked.

$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
Joe DeMate
  • 41
  • 4