user3637971
user3637971

Reputation: 315

Filter lines according to word by powershell

I want to filter lines according to specific word from file in powershell.

For example: the files animal1.txt and animal2.txt. Every file contain lines

dog
cat
dog
dog
bird

Then I want to create two derived files: animal1_bak.txt that stores lines which contains the word 'dog' from animal1.txt

animal2_bak.txt that stores lines which contains the word 'dog' from animal2.txt

What I found on web is:

Select-String -Path "*.*" -Pattern "dog"

But the instruction to create the derived word is missing.

What can I do?

Upvotes: 0

Views: 2693

Answers (3)

Naveen Goyal
Naveen Goyal

Reputation: 93

$folderpath = "D:\AnimalFolder" # your folder path here
$Allfiles = Get-ChildItem -Path $folderpath -Recurse -File -Force -ErrorAction SilentlyContinue |where{$_.Name -match ".txt"} |Select-Object -expandproperty FullName
foreach($filepath in $allfiles)
{
    $Data = get-content $filepath
    foreach($line in $data)
    {
        if($line -match "dog")
        {
            $newpath = $filepath.split('.')[0]
            $getfullpath = $newpath + "_bak.txt"
            $line | out-file $getfullpath -append
        }
    }
}

Upvotes: 0

Esperento57
Esperento57

Reputation: 17462

try Something like this

select-string -Path "c:\temp\animal*.txt" -Pattern "dog" | Group Path | %{
$FileName="{0}_bak.txt" -f $_.Name
$_.Group.Line | select -unique  | Out-File $FileName -Append 
}

Upvotes: 0

TheGameiswar
TheGameiswar

Reputation: 28890

You can first get-content and use set-content like below

Get-Content -Path E:\KTDocs\Scripts\animal1.txt |  where {
 $_ -like  '*dog*'} |Set-Content e:\animalbak.txt

Upvotes: 3

Related Questions