如果我有一个主机名列表(csv,txt,数组等),例如:
abc123A aab123B bcd123C def123A abb123B abb123A abb123B
如何确保前3个字母(站点代码)只有一个实例/ host在数组或列表中?我不需要站点上的任何其他主机,每个唯一站点中的一个主机都可以代表我的最终列表
July
上面的代码本质上仅查找重复项-我可以指定前三个字母以某种方式被看?
提前谢谢
答案 0 :(得分:6)
您可以找到以下重复项:
Get-Content .\names.txt |
Group-Object @{e={$_.Substring(0,3)}} |
Sort-Object Count -Descending
您的示例如下:
Count Name Group
----- ---- -----
3 abb {abb123B, abb123A, abb123B}
1 abc {abc123A}
1 aab {aab123B}
1 bcd {bcd123C}
1 def {def123A}
如果您想要一个只有一个项目的数组,请说出每个组中的第一个项目,然后将其更改为:
$finalList = Get-Content .\names.txt |
Group-Object @{e={$_.Substring(0,3)}} |
Sort-Object Count -Descending |
ForEach-Object {
$_.Group[0]
}
$finalList
在这种情况下将是:
abb123B
abc123A
aab123B
bcd123C
def123A
答案 1 :(得分:1)
这是你的意思吗?
@("abc123A",
"aab123B",
"bcd123C",
"def123A",
"abb123B",
"abb123A",
"abb123B") | select @{ Name = 'Site'; Expression = {$_.SubString(0,3)}} | Select-Object -Property Site -Unique
这将产生以下内容:
Site
----
abc
aab
bcd
def
abb
它使用计算所得的属性从列表中选择前三个字母。
如果要查看分组,可以使用以下方法:
select @{ Name = 'Site'; Expression = {$_.SubString(0,3)}}, @{ Name = 'Host'; Expression = {$_}} | Group-Object -Property Site
哪个会产生这个:
Count Name Group
----- ---- -----
1 abc {@{Site=abc; Host=abc123A}}
1 aab {@{Site=aab; Host=aab123B}}
1 bcd {@{Site=bcd; Host=bcd123C}}
1 def {@{Site=def; Host=def123A}}
3 abb {@{Site=abb; Host=abb123B}, @{Site=abb; Host=abb123A}, @{Site=abb; Host=abb123B}}
如果您只希望每个“站点”中有一个“主持人”,请从每个组中选择第一个,如下所示:
select @{ Name = 'Site'; Expression = {$_.SubString(0,3)}}, @{ Name = 'Host'; Expression = {$_}} | Group-Object -Property Site | %{$_.Group[0].Host}
哪个会给你这个:
abc123A
aab123B
bcd123C
def123A
abb123B
答案 2 :(得分:1)
PS C:\> $HostNames | Group {$_.SubString(0, 3)}
Count Name Group
----- ---- -----
1 abc {abc123A}
1 aab {aab123B}
1 bcd {bcd123C}
1 def {def123A}
3 abb {abb123B, abb123A, abb123B}
或者,如果您只想使用Name
属性:
PS C:\> $HostNames | Group {$_.SubString(0, 3)} | Select -Expand Name
abc
aab
bcd
def
abb
答案 3 :(得分:0)
使用计算所得的属性将文件分组为substring(0,3),
过滤计数大于1且
的组
输出连接到字符串的组。
$Host |Group-Object {$_.Name.Substring(0,3)}|
Where-Object Count -gt 1| ForEach{
"Prefix:{0} = {1}" -f $_.Name,($_.Group -join ',')
}
对文件夹中的输出进行采样,其中包含两个以tmux
开头的文件
Prefix:tmu = tmux-client-5328.log,tmux-server-5330.log
$Hostnames = @"
abc123A
aab123B
bcd123C
def123A
abb123B
abb123A
abb123B
"@
$Hostnames -split '\r?\n' |Group-Object {$_.Substring(0,3)} |
Where-Object Count -gt 1| ForEach-Object {
"Dublettes:{0} = {1}" -f $_.Name,($_.Group -join ',')}
Dublettes:abb = abb123B,abb123A,abb123B