Powershell将一个文件中的行与另一个文件中的行的一部分相匹配。

时间:2015-02-11 10:46:13

标签: powershell

所以我有两个文件,一个带有数字列表和一个描述,另一个带有一个数字列表。

例如:
文件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 
}

2 个答案:

答案 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行,减少了咀嚼输入文件所需的磁盘读取次数。