Powershell:对数组进行重复数据删除

时间:2012-11-05 19:47:12

标签: powershell arraylist deduplication

我有一个管道分隔的平面文件,我需要根据一个对象对条目进行重复数据删除,具体到文件的一部分是:

"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的工作原理。

1 个答案:

答案 0 :(得分: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