用于比较两个文件并将输出合并到第三个文件的 PowerShell 脚本

PowerShell script to compare two files and merge the output the into a third file

我有 2 个文件需要与 PowerShell 进行比较,并使用合并输出生成第三个文件,其中包含来自 file1.txtfile2.txt.

的所有行

这是 file1.txtfile2.txt 的示例:

file1.txt内容

"Name","RcopyGroup","State","Type","Prov","UsrCPG","VSize_MB","Usr_Rsvd_MB","Usr_Used_Perc","Usr_Used_MB","Snp_Rsvd_MB","Snp_Used_Perc"
".srdata","-","normal","base","full","-","81920","81920","100.0","81920","0","0.0"
"admin","-","normal","base","full","-","12288","12288","100.0","12288","0","0.0"
"LUN1","-","normal","base","tpvv","SSD_CPG","1331200","1159552","85.6","1139240","17408","0.0"
"LUN2","-","normal","base","tpvv","FC_CPG","122880","82944","52.3","64304","17408","0.0"
"LUN3","-","normal","base","tpvv","SSD_CPG","71680","56320","73.7","52861","1024","0.0"
"LUN4","-","normal","base","tpvv","FC_CPG","40960","33792","77.9","31922","1024","0.0"
"LUN5","-","normal","base","tpvv","FC_CPG","10240","11264","99.7","10209","1024","0.0"

File2.txt 内容

"Name","LunID","PresentTo","vvWWN"
"LUN1","10","Host1","60002AC0000000000000004400015537"
"LUN1","10","Host3","60002AC0000000000000004400015537"
"LUN1","110","Host2","60002AC0000000000000004400015537"
"LUN1","209","Host5","60002AC0000000000000004400015537"
"LUN1","110","Host4","60002AC0000000000000004400015537"
"LUN2","111","Host2","60002AC000000000080019FC000153AF"
"LUN3","110","Host2","60002AC000000000080019FD000153AF"
"LUN4","210","Host2","60002AC0000000000A004BC500015537"
"LUN5","211","Host2","60002AC0000000000A004BC700015537"
"LUN4","210","Host5","60002AC0000000000A004BC500015537"
"LUN5","211","Host5","60002AC0000000000A004BC700015537"

我希望 file3.txt 上的输出像这样

"Name","RcopyGroup","State","Type","Prov","UsrCPG","VSize_MB","Usr_Rsvd_MB","Usr_Used_Perc","Usr_Used_MB","Snp_Rsvd_MB","Snp_Used_Perc","PresentTo"
".srdata","-","normal","base","full","-","81920","81920","100.0","81920","0","0.0",""
"admin","-","normal","base","full","-","12288","12288","100.0","12288","0","0.0",""
"LUN1","-","normal","base","tpvv","SSD_CPG","1331200","1159552","85.6","1139240","17408","0.0","Host1;Host3;Host2;Host5;Host4"
"LUN2","-","normal","base","tpvv","FC_CPG","122880","82944","52.3","64304","17408","0.0","Host2"
"LUN3","-","normal","base","tpvv","SSD_CPG","71680","56320","73.7","52861","1024","0.0","Host2"
"LUN4","-","normal","base","tpvv","FC_CPG","40960","33792","77.9","31922","1024","0.0","Host2;Host5"
"LUN5","-","normal","base","tpvv","FC_CPG","10240","11264","99.7","10209","1024","0.0","Host2;Host5"

我在论坛里查看过类似的post 但它没有产生我需要的结果。谁能帮忙想个办法。

谢谢。

您可以使用 Group-Object cmdlet 计算出每个名称的主机,然后将新的 属性 添加到 file1 中的每个新对象,并使用 [=13= 加入分组数据].

$file1 = Import-Csv .\file1.csv
$file2 = Import-Csv .\file2.csv

# Group file2 by Name and output as a hashtable 
$group2 = $file2 | Select-Object Name, PresentTo | Group-Object -Property Name -AsHashTable

$file1 | ForEach-Object {
    # Add the new property (column) 'PresentTo' with the matching file2 Hosts joined by ';'
    $_ | Add-Member -NotePropertyName PresentTo -NotePropertyValue ($group2.($_.Name).PresentTo -join ';') -PassThru
} | Export-Csv .\file3.csv

# have a look at our new file
Import-Csv .\file3.csv | Format-Table *

输出

Name    RcopyGroup State  Type Prov UsrCPG  VSize_MB Usr_Rsvd_MB Usr_Used_Perc Usr_Used_MB Snp_Rsvd_MB Snp_Used_Perc PresentTo
----    ---------- -----  ---- ---- ------  -------- ----------- ------------- ----------- ----------- ------------- ---------
.srdata -          normal base full -       81920    81920       100.0         81920       0           0.0
admin   -          normal base full -       12288    12288       100.0         12288       0           0.0
LUN1    -          normal base tpvv SSD_CPG 1331200  1159552     85.6          1139240     17408       0.0           Host1;Host3;Host2;Host5;Host4
LUN2    -          normal base tpvv FC_CPG  122880   82944       52.3          64304       17408       0.0           Host2
LUN3    -          normal base tpvv SSD_CPG 71680    56320       73.7          52861       1024        0.0           Host2
LUN4    -          normal base tpvv FC_CPG  40960    33792       77.9          31922       1024        0.0           Host2;Host5
LUN5    -          normal base tpvv FC_CPG  10240    11264       99.7          10209       1024        0.0           Host2;Host5