如何根据Powershell中的值对删除重复记录?

时间:2016-04-12 09:13:28

标签: powershell

我编写了一个PowerShell脚本,其中我正在读取文件(不一定是CSV)。在这里我有两列,案例编号和cin编号。我希望删除所有记录,如果这一对重复

输入文件:

 abc  1234    class1
 def  1234    class2
 abc  5678    class3
 def  1234    class4
 ghi  1001    class5

所需的输出是:

 abc  1234    class1
 def  1234    class2
 abc  5678    class3
 ghi  1001    class5

为此,我有以下脚本(输入文件将有更多列):

$inputFile ="D:\powershell\test files\01PRD_MAGI_12_03.txt";
$outputFile = "D:\powershell\test files\output.txt" ;
$stream = [System.IO.StreamWriter]"$outputFile"


$seenPair = @{}

$lines = Get-Content $inputFile
$count = 0

foreach($line in $lines){
    $count = $count + 1

    #write all header rows and last line as it is in output file
    if($count -eq 1  -or  $count -eq 2  -or  $count -eq 3 -or $line.startsWith('*') -or $line.startsWith('-')){
        $stream.WriteLine($line);
    } 
    else{
        $ldrCaseNum = $line.Substring(3,7)
        $cin = $line.Substring(70,9)

        if($seenPair.Contains($ldrCaseNum)){
            $cinVal = $seenPair.Get_Item($ldrCaseNum)
            if($cin -eq $cinVal){
                continue;
            }
            else{
                $stream.WriteLine($line)
            }
        }
        else{
            $seenPair.Add($ldrCaseNum,$cin)
            $stream.WriteLine($line)
        }

    }
}

$stream.close()

但是在这种情况下,如果同一对重复存储在$ seenPair变量中,那么该记录将被删除。但对于相同的密钥,不同的值对将重复,然后它不会删除它,因为它已经为该密钥保留了一个值。

示例:

 abc  1234    class1
 def  1234    class2
 abc  5678    class3
 abc  5678    class3
 def  1234    class4
 ghi  1001    class5

输出将是:

 abc  1234    class1
 def  1234    class2
 abc  5678    class3
 abc  5678    class3
 ghi  1001    class5

所需的输出是:

 abc  1234    class1
 def  1234    class2
 abc  5678    class3
 ghi  1001    class5

还有其他解决办法吗?

1 个答案:

答案 0 :(得分:1)

我要将文件解析为对象,作为读者练习,并专注于删除重复对。

# First we have an array of objects
$Objects = @'
abc 1234 class1
def 1234 class2
abc 5678 class3
def 1234 class4
ghi 1001 class5
'@ |ConvertFrom-Csv -Delimiter " " -Header Case,Cin,Class

现在,我们只需要删除" Case / Cin"已经存在的组合是Sort-Object -Unique

PS C:\> $Objects |Sort-Object -Property Case,Cin -Unique
case cin  class
---- ---  -----
abc  1234 class1
abc  5678 class3
def  1234 class4
ghi  1001 class5