考虑文件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'
非常感谢任何帮助。
答案 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]}