我有一系列结构如下的 JSON 文件:
{
"start": "B",
"end": "D",
"display": true
}
Run Code Online (Sandbox Code Playgroud)
其内容为:
| 文件 | start |
end |
display |
|---|---|---|---|
| 1 | 乙 | C | 真的 |
| 2 | 乙 | C | 真的 |
| 3 | 乙 | D | 真的 |
| 4 | A | 乙 | 真的 |
| 5 | A | C | 真的 |
| 6 | A | 乙 | 真的 |
这些文件在 PowerShell 中解析如下:
$edges = Get-ChildItem -Filter "*.json" `
| ForEach-Object { Get-Content $_.FullName | Out-String | ConvertFrom-Json | Select-Object @{n="start";e={$_.start}},@{n="end";e={$_.end}},@{n="display";e={$_.display}} }
# start end display
# ----- --- -------
# B C True
# B C True
# B D True
# A B True
# A C True
# A B True
Run Code Online (Sandbox Code Playgroud)
我现在想要过滤集合以仅包含唯一值;在我的场景中,顺序并不重要:
# Desired Output
#
# start end display
# ----- --- -------
# B C True
# B D True
# A B True
# A C True
Run Code Online (Sandbox Code Playgroud)
根据我对官方文档的解释,我应该在调用之前对集合进行排序Get-Unique:
$edges = $edges `
| Sort-Object -Property @{Expression = "start"; Descending = $False}, @{Expression = "end"; Descending = $False} `
| Get-Unique
Run Code Online (Sandbox Code Playgroud)
但是,无论集合是否已排序,Get-Unique都只返回第一项:
# Unsorted:
#
# start end display
# ----- --- -------
# B C True
# Sorted:
#
# start end display
# ----- --- -------
# A B True
Run Code Online (Sandbox Code Playgroud)
我是否误解了Get-Unique工作原理?如何才能达到预期的产出?
Get-Unique有两个参数集。一种是使用-AsString参数,一种是使用-OnType参数。当自定义对象的集合通过管道传输到 时Get-Unique,-OnType将使用该参数。因此,它只输出每种类型的一个对象。如果明确使用该-AsString参数,您将得到预期的结果。
# json
$json = @'
[{
"start": "B",
"end": "D",
"display": true
},
{
"start": "B",
"end": "D",
"display": true
},
{
"start": "A",
"end": "F",
"display": false
},{
"start": "A",
"end": "F",
"display": false
}
]
'@
($json | ConvertFrom-Json) | Sort-Object start,end,display | Get-Unique -AsString
Run Code Online (Sandbox Code Playgroud)
输出:
start end display
----- --- -------
A F False
B D True
Run Code Online (Sandbox Code Playgroud)
请注意,Get-Unique比较字符串时区分大小写。
| 归档时间: |
|
| 查看次数: |
2256 次 |
| 最近记录: |