所以我有两个文件,一个带有数字列表和一个描述,另一个带有一个数字列表。
例如:
文件1包含:
10001 Screw
23456 Bolt
File2包含:
10001
23456
23456
我尝试做的是每次在File2中出现数字时,它都会向其添加说明或将数字和说明输出到新文件。
所以结果如下:
10001 Screw
23456 Bolt
23456 Bolt
这些只是小样本,但实际文件有数千行。
这是我提出的,但不太正确。
$file1 = "C:\pstest\file1.txt"
$file2 = "C:\pstest\file2.txt"
Get-Content $file2 | Foreach-Object -process {Get-Content $file1 | Where-Object $_ -contains $file2 | write-host $_ }
OR
$file1 = "C:\pstest\file1.txt"
$file2 = "C:\pstest\file2.txt"
$file3 = "C:\pstest\file3.txt"
Get-Content $file2
foreach ($line in $file2){
Get-Content $file1 | Where-Object $_ -contains $line | out-file $file3
}
答案 0 :(得分:0)
这可能是使用哈希表的好例子。首先,加载file1
,迭代它并将行存储为键值对。然后,您只需在file2
中查找哈希值并获取相应的项目:
$file1 = Get-Content "C:\pstest\file1.txt"
$file2 = Get-Content "C:\pstest\file2.txt"
$file3 = "C:\pstest\file3.txt"
$h = @{}
foreach($line in $file1) {
if ($line -match '(\d+)\s+(.*)') {
$h[$matches[1]] = $matches[2]
}
}
foreach($line in $file2) {
$line = $line.trim()
write-output "$line $($h[$line])" | Tee-Object $file3 -Append
}
答案 1 :(得分:0)
同意哈希表,但对于那么多行,我会这样做:
$HT = @{}
Get-Content $file1 |
foreach {
$HT[$_.split("`t",2)[0]] = $_.split("`t",2)[1]
}
Get-Content $file2 -ReadCount 5000 |
foreach {
foreach ($part in $_)
{
"$part $($HT[$part])" |
Add-Content $file3
}
}
这使您可以在内存中一次使用5000行,减少了咀嚼输入文件所需的磁盘读取次数。