2013-08-09 5 views
1

У меня есть еще одна сложная проблема с Powershell. У меня есть список из ~ 4000 записей, где у меня есть следующие детали:Powershell: Сравнение нескольких значений в массиве

<Computername> | <Username> | <StartDate> | <LastDate> | <IDNum> 
computer1  | jsmith  | 4/12/12  | 4/12/13 | 52648 
computer1  | jsmith  | 4/12/12  | -   | 52649 
computer1  | jsmith  | 4/12/12  | 8/7/13  | 52644 
computer2  | hreid  | 2/5/12  | 8/5/13  | 52396 
computer2  | hreid  | 4/10/12  | 5/18/13 | 52300 
computer3  | mdrake  | 2/10/11  | 12/18/12 | 52590 
computer3  | mdrake  | 5/10/11  | 3/20/12 | 52593 

Сво CSV, я пытаюсь найти способ, чтобы сравнить COMPUTERNAME и LastDate поля и выплюнуть список наиболее недавняя строка с соответствующим значением имени пользователя. Я могу читать CSV в переменную, но у меня есть время с значениями get-member и для каждого цикла.

В идеале результат будет выглядеть следующим образом:

<Computername> | <Username> | <StartDate> | <LastDate> | <IDNum> 
computer1  | jsmith  | 4/12/12  | 8/7/13  | 52644 
computer2  | hreid  | 2/5/12  | 8/5/13  | 52396 
computer3  | mdrake  | 5/10/11  | 3/20/12 | 52593 

Вид комплекса ... Я на самом деле не в состоянии сломать это в моей голове. Любая помощь? Или даже идеи о том, как я могу начать писать сценарии ... Я нахожусь здесь на стене.

--Update--

Спасибо Rynant. Поэтому я узнал, что, по-видимому, мой исходный список немного сложнее. В нем отсутствуют некоторые имена компьютеров из списка ... кроме того, отсутствуют и некоторые последние записи. Поэтому мне нужно изменить первоначальный список, чтобы выглядеть следующим образом:

<Computername> | <Username> | <StartDate> | <LastDate> | <IDNum> 
computer1  | jsmith  | 4/12/12  | 4/12/13 | 52648 
computer1  | jsmith  | 4/12/12  | -   | 52649 
computer1  | jsmith  | 4/12/12  | 8/7/13  | 52644 
computer2  | hreid  | 2/5/12  | 8/5/13  | 52396 
computer2  | hreid  | 4/10/12  | 5/18/13 | 52300 
computer3  | mdrake  | 2/10/11  | 12/18/12 | 52590 
computer3  | mdrake  | 5/10/11  | 3/20/12 | 52593 
       | fmann  | 4/11/12  | 3/20/13 | 52342 

Попробую с вашим примером кода и посмотреть, как я делаю. Я действительно раздражен в этом исходном списке, поскольку я нахожу все виды вещей, отсутствующих для некоторых записей ... argh.

ответ

5

Вы можете группировать имя Computername, затем для каждой группы сортировать по LastDate и выбирать последний элемент.

Вам придётся настроить в соответствии с вашими требованиями к форматированию, но это будет выглядеть примерно так.

Import-Csv -Path .\computers.csv| 
    group -Property Computername| 
    foreach { 
     $_.group| 
      sort { try { [datetime]$_.LastDate } catch {} }| 
      select -last 1 
    }| 
    Export-Csv -Path .\computers_LastDate.csv -NoTypeInformation 
Смежные вопросы