2015-02-11 62 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

相關問題