PowerShell:从文件中删除类似的行

时间:2017-10-17 11:18:20

标签: regex powershell text-manipulation

考虑文件tbl.txt 150万行),构建如下:

Num1 ; Num2 ; 'Value' ; 'Attribute'

所以tbl.txt看起来像是:

  63 ; 193 ; 'Green'  ; 'Color'
 152 ; 162 ; 'Tall'   ; 'Size'
 230 ; 164 ; '130lbs' ; 'Weight'
 249 ; 175 ; 'Green'  ; 'Color'      *duplicate on 'Value' and 'Attribute'*
 420 ; 178 ; '8'      ; 'Shoesize'
 438 ; 172 ; 'Tall'   ; 'Size'       *duplicate on 'Value' and 'Attribute'*

如何保持'Value''Attribute'上的第一个独特行? 并删除'Value''Attribute'上的重复行?

结果如下:

  63 ; 193 ; 'Green'  ; 'Color'
 152 ; 162 ; 'Tall'   ; 'Size'
 230 ; 164 ; '130lbs' ; 'Weight'
 420 ; 178 ; '8'      ; 'Shoesize'

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

假设您的数据没有标题:

Import-CSV "C:\folder\data.txt" –Delimiter ";" -Header Num1,Num2,Value,Attribute | Sort-Object -Property Value -Unique

提供您想要的输出:

Num1 Num2 Value     Attribute 
---- ---- -----     --------- 
230  164  '130lbs'  'Weight'
420  178  '8'       'Shoesize'
63   193  'Green'   'Color'
152  162  'Tall'    'Size'

您可以使用Export-CSV导出结果:

Import-CSV "C:\folder\data.txt" –Delimiter ";" -Header Num1,Num2,Value,Attribute | Sort-Object -Property Value -Unique | Export-CSV "C:\folder\data2.txt" –Delimiter ";" -NoTypeInformation

答案 1 :(得分:0)

通过Get-Content遍历文本文件,通过字符串操作分隔列'Value' ; 'Attribute',然后使用散列图检查是否已经处理了类似的行 - 如果没有,则输出这条线一次。在代码中:

$map = @{};
Get-Content tbl.txt | ` 
             %{ $key = $_.Substring($_.IndexOf(';',$_.IndexOf(';')+1)+1); `
                If(-not $map.ContainsKey($key)) { $_; $map[$key] = 1 } `
              } 

或者,如评论中所述,您可以使用group并将相同的子字符串应用于分组标准,最后获取每个组的第一个元素:

Get-Content tbl.txt | group {$_.Substring($_.IndexOf(';',$_.IndexOf(';')+1)+1)} `
                    | %{$_.Group[0]}