我創建了一個 powershell 命令來收集和排序 txt 檔案。
輸入示例:
a,1
a,1
b,3
c,4
z,5
我必須得到的輸出:
a,2
b,3
c,4
z,5
到目前為止,這是我的代碼:
$filename = 'test.txt'
Get-Content $filename | ForEach-Object {
$Line = $_.Trim() -Split ','
New-Object -TypeName PSCustomObject -Property @{
Alphabet= $Line[0]
Value= [int]$Line[1]
}
}
負值輸入示例
a,1,1
a,1,2
b,3,1
c,4,1
z,5,0
uj5u.com熱心網友回復:
Import-Csv使用給定的列名 ( )將您的文本檔案作為 CSV 檔案匯入-Header,這會將行決議為以列名作為屬性名的物件。然后使用
Group-Object按共享.Letter值(即每行第一個欄位中的字母)對物件進行分組。使用
ForEach-Object,處理每組物件(行),并輸出一個字串,其中包含共享字母和.Number組成該組的物件中所有屬性值的總和,通過以下方式獲得:Measure-Object-Sum
@'
a,1
a,1
b,3
c,4
z,5
'@ > ./test.txt
Import-Csv -Header Letter, Number test.txt |
Group-Object Letter |
ForEach-Object {
'{0},{1}' -f $_.Name, ($_.Group | Measure-Object -Sum -Property Number ).Sum
}
注意:上述OOP 方法很靈活,但可能很慢。這是一個可能會表現更好的純文本替代方案:
Get-Content test.txt |
Group-Object { ($_ -split ',')[0] } |
ForEach-Object {
'{0},{1}' -f $_.Name, ($_.Group -replace '^. ,' | Measure-Object -Sum).Sum
}
也可以看看:
-split,字串分割算子-replace, 基于正則運算式的字串替換運算子
對多個欄位求和進行分組:
擴展 OOP 方法很容易:添加另一個標題欄位來命名附加列,并添加另一個輸出欄位,該欄位也將每個組的添加列的值相加:
@'
a,1,10
a,1,10
b,3,30
'@ > ./test.txt
Import-Csv -Header Letter, NumberA, NumberB test.txt |
Group-Object Letter |
ForEach-Object {
'{0},{1},{2}' -f $_.Name,
($_.Group | Measure-Object -Sum -Property NumberA).Sum,
($_.Group | Measure-Object -Sum -Property NumberB).Sum
}
輸出(注意a行中的值):
a,2,20
b,3,30
擴展純文本方法需要更多的作業:
@'
a,1,10
a,1,10
b,3,30
c,4,40
z,5,50
'@ > ./test.txt
Get-Content test.txt |
Group-Object { ($_ -split ',')[0] } |
ForEach-Object {
'{0},{1},{2}' -f $_.Name,
($_.Group.ForEach({ ($_ -split ',')[1] }) | Measure-Object -Sum).Sum,
($_.Group.ForEach({ ($_ -split ',')[2] }) | Measure-Object -Sum).Sum
}
uj5u.com熱心網友回復:
解決此問題的一種方法是使用Group-Object計數,然后用計數替換逗號后的當前數字。
$filename = 'test.txt'
Get-Content $filename | Group-Object |
ForEach-Object -Process {
if ($_.Count -ne 1) {
$_.Name -replace '\d',$_.Count
}
else {
$_.Name
}
} | ConvertFrom-Csv -Header 'Alphabet','Value'
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/517238.html
標籤:电源外壳
