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.

2
  • 2
    Use -in instead of -match, explained in the answers here of almost the same thing: stackoverflow.com/questions/39307707/… Commented Sep 5, 2016 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). Commented Sep 5, 2016 at 22:12

2 Answers 2

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)} 
Sign up to request clarification or add additional context in comments.

3 Comments

the -NotIn way is the one for my case! Thanks! But it doesn't work when lines contain accent caracteres... Any hint ?
@Pozinux please read Get-Content for FileSystem, use appropriate value for -Encoding parameter.
Found the solution! Thanks so much for your quick anwser.
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

1 Comment

I get the following error: Where-Object : Cannot bind argument to parameter 'FilterScript' because it is null. Any ideas?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.