Powershell文本文件比较替换

时间:2016-12-20 10:46:21

标签: list powershell object replace foreach

我有一个带有Names的文本文件和一个带有名称和数字的文本文件,如下所示:

A.TXT:

Anna
Edward
Markus
Jenny
Jens

b.txt:

23434Anna
65790569Edward
4343Johann
2432343Hannah
2458435Jens

所以这只是一个例子。列出a就像500行,列表b 2000。

所以我想做的是比较两个列表,每次都是" b.txt"包含来自" a.txt"的一行(比如" Anna"在" 23434Anna")我想替换" b.txt"使用" a.txt"的行。所以这一行应该改为" Anna"。

我试过像

这样的东西
ForEach($a in $b) {$a -replace $b}

所以我知道这有点不同但我想弄清楚我要做什么。我需要一种方法将特定的行分隔成唯一的对象。我知道可以通过索引来完成...但我不知道如何循环变量的索引。

问候

2 个答案:

答案 0 :(得分:0)

试试这个

#extract list value to search
$listval=gc "C:\temp\a.txt"

#For every row, search in list and export into same file
gc "C:\temp\b.txt" | %{
$row=$_

#get first element in list where current content of row like value
$founded=($listval | where {$row -like "*$_*"} | select -First 1)

#if number of element founded is great 0 , print founded element on output    
if ($founded.count -gt 0)
{
    $founded
}
#else print current element without modification
else
{
   $row 
}

} | 
#redirect result into new file
out-file "C:\temp\c.txt"

在你的例子中你应该使用'-clike'而不是'-like'用于区分大小写,因为Hannah包含anna;)

答案 1 :(得分:0)

其他解决方案,更好,因为它测试平等而不喜欢(对于汉娜和安娜)

#extract list value to search
$listval=gc "C:\temp\a.txt"

#template for describe cut for file
$template=@"
{Word*:{id:12}{Name:Abc}}
{Word*:{id:456}{Name:eFG}}
"@

#cut file with template and test for result
gc "C:\temp\b.txt" | ConvertFrom-String -TemplateContent $template | 
select @{N="Result";E={if ($listval -contains $_.Word.Name) {$_.Word.Name} else {$_.Word.ID+$_.Word.Name}}}