在PowerShell中从大型2D阵列中删除重复项的有效方法

时间:2019-06-05 19:10:28

标签: arrays powershell duplicates large-data

我拥有大量数据,这些数据大约需要1000万个项目,这些数据需要有效处理并根据六个列标题中的两个快速删除重复的项目。

我曾尝试对项目进行分组和排序,但速度非常慢。

$p1 = $test | Group-Object -Property ComputerSeriaID,ComputerID 
    $p2 =  foreach ($object in $p1.group) { 
           $object | Sort-Object -Property FirstObserved | Select-Object -First 1
        }

目标是通过评估两列来删除重复项,同时根据最早观察到的记录保持最旧的记录。

数据看起来像这样:

最后观察时间:2019-06-05T15:40:37 第一次观察:2019-06-03T20:29:01 电脑名称:1 电脑编号:2 虚拟:3 ComputerSerialID:4

最后观察时间:2019-06-05T15:40:37 第一次观察:2019-06-03T20:29:01 电脑名称:5 电脑编号:6 虚拟:7 ComputerSerialID:8

最后观察时间:2019-06-05T15:40:37 第一次观察:2019-06-03T20:29:01 电脑名称:9 电脑编号:10 虚拟:11 ComputerSerialID:12

4 个答案:

答案 0 :(得分:0)

您可能想稍微整理一下您的问题,因为它很难读,但我将尽我所能来尽我所能,尽您所能。

不幸的是,由于数据量太多,无法快速执行此操作。字符串比较和排序是通过蛮力完成的;除了一次测量一个字符是否相同,没有其他方法可以降低将一个字符串中的每个字符与另一个字符串进行比较的复杂性。

(老实说,如果我是我,我只会在excel中使用export-csv $objectperform this operation。只为一次这样的脚本编写时间权衡是不值得的。)< / p>

通过“项目”,我将假设您的意思是表中的行,并且您没有尝试仅检索要查找的行中的字符串。您已经掌握了选择对象的基本概念,可以对整个表进行操作:

$outputFirstObserved = $inputData | Sort-Object -Property FirstObserved -Unique 
$outputLastObserved = $inputData | Sort-Object -Property LastObserved -Unique

现在您的内存中有大约2000万行,但是我想这比手工完成要好。剩下的就是join the two tables。您可以使用Install-Script -Name Join从powershell画廊下载该Join-Object命令,并按所述方式使用它。如果您想自己执行此步骤,最简单的方法是将两个表压缩在一起,然后再次对其进行排序:

$output = $outputFirstObserved + $outputLastObserved
$return = $output | Sort-Object | Get-Unique

答案 1 :(得分:0)

这样做吗?它保留了最先找到的那个。

$test | sort -u ComputerSeriaID, ComputerID 

答案 2 :(得分:0)

我创建了此函数来删除多维数组的重复数据。 基本上,我连接记录的内容,并将其添加到哈希中。 如果连接文本已存在于哈希中,请不要将其添加到要返回的数组中。

products

答案 3 :(得分:0)

尝试以下脚本。

由于要避免PS中出现任何管道,因此应尽可能快。

for (var in 1:10)
{
  sprintf('I want to print this number: %d', var)
}