2015-02-11 80 views
1

所以我有两个文件,一个带有数字和描述列表,另一个带有数字列表。Powershell将一个文件中的行匹配到另一行中的一行。

如:
文件1包含:

10001 Screw 
23456 Bolt 

文件2包含:

10001 
23456 
23456 

我想要做的就是为每一个数字出现在文件2时它添加描述它或输出数字和描述到一个新的文件。
那么结果会是什么样子:

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

应该提到两者都是制表符分隔的。 – 2015-02-12 23:43:54

回答

0

这可能是使用Hashtable的一个很好的例子。首先,加载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 
} 
+0

感谢您的回复。你能解释一下匹配标准吗?(\ d +)\ s +(。*)'?重要的是,有些数字像是带有字母的“100-015”(带破折号)或“100-015-PL”,并且这两个数字是分开的?此代码也不喜欢-Append给出错误'Tee-Object:无法找到与参数名称'Append'相匹配的参数。' – 2015-02-12 23:38:15

+0

匹配是一个或多个数字后跟一个或多个空格,其后是其他任何内容。正如你所说的,这些值是制表符分隔的,你可以将它改为'(。*?)\ t(。*)'。你可以删除'Tee-Object',我只把它放在那里,所以它会写入屏幕和文件。您可以将其传送到“Out-File”。 – arco444 2015-02-13 10:08:09

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行,从而减少啃入输入文件所需的磁盘读取次数。

+0

这是一个有趣的观点......为什么每次读取5000行会减少磁盘读取次数?我认为'Get-Content'将整个文件加载到内存中?它是否真的有一个参考,并在背景中做一些聪明的事情? – arco444 2015-02-11 11:55:39

+0

Get-Content,默认一次读取一行(ReadCount 1)。 ReadCount 0会将整个文件加载到内存中,但内存管理会影响性能。对于小型记录,3-5000的ReadCount应该是一次处理一个进程所能处理的一次,而不必进行大量的内存管理以腾出空间。使用5000的ReadCount将使得Get-Content开始读取,并且一次处理5000行的数组,然后您只需在每个数组中循环遍历每个数组。 – mjolinor 2015-02-11 12:38:22

+0

我认为哈希表是最好的选择。我开始看那个,但不是很熟悉它,所以没有追求。这段代码给了我在file3中输出的中文字符?也许是与输入有关。如下所示,其中一些数字包含破折号和字母,零件和描述以制表符分隔。 – 2015-02-12 23:42:32

相关问题