如何根据另一个文件中的字符串列表删除多个文本文件的行?

时间:2016-05-26 17:04:37

标签: powershell

我有多个逗号分隔的文本文件(每个文件有超过100万行)。我还有一个名为“delete.log”的文件。

delete.log文件的结构如下:

STRING1   
STRING2   
STRING3  
.  
.   
STRING N

构建许多txt文件之一是这样的: name1.txt:

text1,text2,text3,text4,STRING1            "entire row will be deleted" 
text1,text2,text3,text4,STRING1            "entire row will be deleted"
text1,text2,text3,text4,text5              
text1,text2,text3,text4,STRING2            "entire row will be deleted"     
text1,text2,text3,text4,STRING1            "entire row will be deleted"
text1,text2,text3,text4,text5                  

我正在寻找一种有效的方法如何从文件“delete.log”中读取每个文本字符串,如果第5行中的匹配项与来自delete.log文件的文本字符串匹配, 整行将被删除。 此外,如果文件夹中的文本文件具有delete.log中的文件名 像STRING1.txt一样,文件将被删除。

如果第5列中的文本字符串为STRING1

,则下面的代码只删除多个文本文件中的整行
$paths = Get-ChildItem '.\' -Filter '*.txt'
ForEach ($path in $paths) {
$pathtmp = "$path.tmp"

$sr = New-Object -TypeName System.IO.StreamReader -ArgumentList $path
$sw = New-Object -TypeName System.IO.StreamWriter -ArgumentList $pathtmp

Do {
 $line = $sr.ReadLine()
 $Column =  $line.split(",")


If ($Column[4] -ne "STRING1")  {
    $sw.WriteLine($line)
}
} Until ( $sr.EndOfStream )

$sr.close()
$sw.close()

Remove-Item $path
Rename-Item $pathtmp $path
}

1 个答案:

答案 0 :(得分:0)

只需使用Get-Content cmldet读取文件,使用Select-String cmdlet过滤条目,最后使用Set-Content写回条目:

$deleteLog = Get-Content 'delete.log'
$name1 = Get-Content 'name1.txt'

$name1 | Select-String -NotMatch $deleteLog | Set-Content 'name1.txt'

现在name1.txt的内容:

text1,text2,text3,text4,text5              
text1,text2,text3,text4,text5