2012-11-05 53 views
1

我有分隔的平面文件的管從我需要刪除重複基於對象的條目,爲特定的文件的一部分是:Powershell的:重複數據刪除的陣列

"001A"|"1"|"*"||"A"|"504367667"|"1"|"2005-06-10-16.57.23.000000"| 
"001A"|"1"|"*"||"A"|"504367667"|"1"|"2005-10-24-16.52.29.000000"| 
"001A"|"1"|"*"||"A"|"504367667"|"1"|"2007-12-13-15.48.47.000000"| 
"001A"|"1"|"*"||"A"|"504367667"|"1"|"2008-12-09-17.10.39.000000"| 
"001B"|"1"|"*"||"B"|"800026800"|"1"|"2005-08-08-10.48.16.000000"| 
"001C"|"1"|"*"||"C"|"490349139"|"1"|"2006-01-19-12.03.08.000000"| 
"001C"|"1"|"*"||"C"|"490349139"|"1"|"2009-03-12-15.08.11.000000"| 

第一個字段是ID和最後一個字段是一個時間戳,我想重複刪除條目,以便只爲每個ID保留最新的時間戳條目。所以,我需要的輸出應該是:

"001A"|"1"|"*"||"A"|"504367667"|"1"|"2008-12-09-17.10.39.000000"| 
"001B"|"1"|"*"||"B"|"800026800"|"1"|"2005-08-08-10.48.16.000000"| 
"001C"|"1"|"*"||"C"|"490349139"|"1"|"2009-03-12-15.08.11.000000"| 

我與不同的對象名字的數組讀取文件和存儲的條目,然後我試圖

$inputdeduped = $inputfilearray | Sort-Object Date 
$inputdeduped = $inputdeduped | Select-Object ID -Unique 

希望,一旦日期被排序,這裏用作-unique的get-unique cmdlet將選擇排序數組中第一個或最後一個重複條目,這取決於我將按照desc還是asc順序排序日期,但它不會隨機挑選一個條目。

請幫我解決問題,或者幫我理解get-unique cmdlet的工作原理。

回答

2

你可以試試這個:

$newInputdeduped = $inputfilearray | sort id, date -ascending | group -Property id | 
    select @{n="GroupedList"; e={ $_.group | select -first 1 }} | 
    select -expa list 

這是我做你的榜樣數據保存爲txt文件後:

> $a = Import-Csv -Header "id","n1","n2","v1","n3","n4","n5","date" -Path .\c.txt -delimiter '|' 

> $a | ft -AutoSize 

id n1 n2 v1 n3 n4  n5 date 
-- -- -- -- -- --  -- ---- 
001A 1 *  A 504367667 1 2005-06-10-16.57.23.000000 
001A 1 *  A 504367667 1 2005-10-24-16.52.29.000000 
001A 1 *  A 504367667 1 2007-12-13-15.48.47.000000 
001A 1 *  A 504367667 1 2008-12-09-17.10.39.000000 
001B 1 *  B 800026800 1 2005-08-08-10.48.16.000000 
001C 1 *  C 490349139 1 2006-01-19-12.03.08.000000 
001C 1 *  C 490349139 1 2009-03-12-15.08.11.000000 

> $b = $a | sort id, date -ascending | group -Property id | select @{n="list";e={ $_.group | select -first 1 }} | select -expa list 

    > $b | ft -AutoSize 

id n1 n2 v1 n3 n4  n5 date 
-- -- -- -- -- --  -- ---- 
001C 1 *  C 490349139 1 2009-03-12-15.08.11.000000 
001B 1 *  B 800026800 1 2005-08-08-10.48.16.000000 
001A 1 *  A 504367667 1 2008-12-09-17.10.39.000000 
+0

力的工作,它給了一個空白文件。我可以理解你的解決方案將按ID分組排序的輸入,然後在第三個管道中選擇組的第一行,但我不明白最後2個管道中發生了什麼。 – DhawalV

+0

'group-object'返回一個自定義對象的數組,其中有兩個'select-object'我重建了一個數組,像一個管道。我不知道你是如何構建'$ InputFilearray'的。 –

+0

它終於奏效了,我拼錯了變量名! – DhawalV