bestsource

파워셸에서 개체의 두 가지 속성을 기반으로 고유한 개체를 선택하려면 어떻게 해야 합니까?

bestsource 2023. 8. 12. 10:31
반응형

파워셸에서 개체의 두 가지 속성을 기반으로 고유한 개체를 선택하려면 어떻게 해야 합니까?

속성이 6개인 개체 배열이 있습니다.다음과 같이 표시됩니다.

$csvData
CURRENT DATE AND TIME : 07/10/2015 08:17:17 CST
USER NAME             : userName
COMPUTER NAME         : computerName
IP ADDRESS            : 192.168.1.1
LOGON SERVER          : logonServer
LOGON/OFF             : logon

사용자 이름과 컴퓨터 이름이 중복되지 않는 개체 배열을 만들고 싶습니다.파워셸에서 고유한 사용자 이름/컴퓨터 이름 콤보만 가져오려면 어떻게 해야 합니까?궁극적으로 모든 중복 항목을 제거하고 중복 항목의 수를 추적하는 속성 'Count'를 추가하고 싶습니다.

시도해 본 결과:

$csvDataUnique = $csvData | Select-Object 'User Name','Computer Name' -Unique
$csvDataUnique = $csvData | sort -Property 'User Name' | Get-Unique

마티아스의 답변과 매우 유사하지만 출력에 모든 열이 포함됩니다.

$csvDataUnique = $csvData | 
  Group-Object 'User Name','Computer Name' | 
  %{ $_.Group | Select 'User Name','Computer Name' -First 1} | 
  Sort 'User Name','Computer Name' 

다른 답변은 최종 출력의 나머지 속성을 유지하지 못했습니다.이 방법은 다음과 같습니다.

$csvDataUnique = $csvData | Group-Object -Property 'User Name', 'Computer Name' | ForEach-Object { $_.Group[0] }

사용자 지정 속성을 생성할 수 있습니다.Select-Object그래서 당신은 이미 꽤 가까웠군요.사용해 보십시오.

Select-Object @{Label = "Index"; Expression = {"$($_.'User Name') $($_.'Computer Name')"} } -Unique

기본적으로 두 필드를 하나의 문자열로 결합하고 고유한 정렬을 수행합니다.저는 그 분야를 "Index"라고 불렀지만, 그것은 아무 것이나 부를 수 있었습니다.

다른 옵션은 다음을 사용하는 것입니다.Get-Unique각 루프에 대한 확장 없이 고유한 속성을 기반으로 객체를 선택하고자 할 때 도움이 되었습니다.

$csvData | Sort-Object 'User Name', 'Computer Name' | Get-Unique -AsString

다음과 같은 이유로 개체를 정렬해야 합니다.Get-Unique인접한 문자열을 비교합니다.또한 비교는 대소문자를 구분합니다.

저는 보통 해시 테이블을 사용하며, 이러한 작업에 대한 키에 대한 속성 값을 결합했습니다.

$CSVDataUnique = @{}

$csvData | foreach {
 $CSVDataUnique["$_.'User Name'\$_.'Computer Name'"]++
}

사용할 수 있습니다.Group-Object여러 속성으로 그룹화:

$Uniqs = $csvData | Group -Property "USER NAME","COMPUTER NAME" -NoElement | Select -Expand Name

언급URL : https://stackoverflow.com/questions/31343752/how-can-you-select-unique-objects-based-on-two-properties-of-an-object-in-powers

반응형