2012-11-05 100 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