【问题标题】:How can i reorganise powershell's compare-object output?如何重新组织 powershell 的比较对象输出?
【发布时间】:2013-07-03 10:50:28
【问题描述】:

我将 2 个 CSV 与 compare-object cmdlet 进行比较:

Compare-object $CSV1 $CSV2 -property Header, Value -passthru | sort-object Header

比较 2 个 CSV 后,我得到以下输出:

Header              Value           SideIndicator
-------             -----           -------------
String1             Value 1             <=
String1             Value 2             =>
String2             Value 3             <=
String2             Value 4             =>
String3             Value 5             =>
String4             Value 6             <=

我想把它重新组织成以下格式

Header1             Old Value       New Value
------              ---------       ---------
String1             Value 1         Value 2
String2             Value 3         Value 4
String3             NA              Value 5
String4             Value 6         NA

这在 powershell 中可行吗?

【问题讨论】:

    标签: powershell compare


    【解决方案1】:

    你可以试试这个:

    $a = Compare-Object (Import-Csv 'C:\temp\f1.csv')  (Import-Csv 'C:\temp\f2.csv')  -property Header,Value
    $a | Group-Object -Property Header | % { New-Object -TypeName psobject -Property @{Header=$_.name;newValue=$_.group[0].Value;oldValue=$_.group[1].Value}}
    

    【讨论】:

    • 谢谢,这正是我需要的!
    • Answer 没有给出 OP 要求的确切结果 - 对于所有不匹配的行 Group 数组只有一个元素 (0),因此 Value 将始终放置在 newValue 列中,而oldValue 列将保持为空。我也不确定 Group 数组中元素的顺序,所以需要检查每个元素的 SideIndicator 属性。
    【解决方案2】:

    正如my comment 所指出的,JPBlanc's answer 有一些缺陷。这是基于他的代码的改进:

    $CSV1 = Import-Csv "C:\temp\f1.csv"
    $CSV2 = Import-Csv "C:\temp\f2.csv"
    $Diff = Compare-Object $CSV1 $CSV2 -property Header, Value
    function Value-On-SideIndicator($Object, $SideIndicator) {
        $Group = $Object.Group | ? {$_.SideIndicator -eq $SideIndicator}
        if ($Group -ne $null) { $Group.Value } else { "NA" }
    }
    $Diff | Group-Object -Property Header | % {
        New-Object -TypeName psobject -Property @{
            Header = $_.Group[0].Value;
            newValue = Value-On-SideIndicator $_ "=>";
            oldValue = Value-On-SideIndicator $_ "<="
        }
    } | Format-Table Header, oldAmount, newAmount -AutoSize
    

    Powershell 7:(使用空合并运算符)

    $CSV1 = Import-Csv "C:\temp\f1.csv"
    $CSV2 = Import-Csv "C:\temp\f2.csv"
    $Diff = Compare-Object $CSV1 $CSV2 -property Header, Value
    $Diff | Group-Object -Property Header | % {
        New-Object -TypeName psobject -Property @{
            Header = $_.Group[0].Value;
            newValue = ($_.Group | ? {$_.SideIndicator -eq "=>"}).Value ?? "NA";
            oldValue = ($_.Group | ? {$_.SideIndicator -eq "<="}).Value ?? "NA"
        }
    } | Format-Table Header, oldAmount, newAmount -AutoSize
    

    【讨论】:

      猜你喜欢
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 2019-04-21
      相关资源
      最近更新 更多