我有一个带有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}
所以我知道这有点不同但我想弄清楚我要做什么。我需要一种方法将特定的行分隔成唯一的对象。我知道可以通过索引来完成...但我不知道如何循环变量的索引。
问候
答案 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}}}