如何对 Select-String 提取的数字求和?
How can I sum numbers extracted by Select-String?
假设我有一个文件 numbers.txt
:
My number 1
...
My number 2
...
My number 3
...
我正在尝试计算以上数字的总和。我从每一行中提取了一个数字,如下所示:
PS > $numbers = gc .\numbers.txt | sls -Pattern "number\ (\d+)" |
>> select {$_.matches[0].groups[1].Value}
>>
PS > $numbers
$_.matches[0].groups[1].Value
-----------------------------
1
2
3
看起来正是我想要总结的。接下来我尝试应用测量对象:
$numbers | measure -sum
measure : Input object "" is not numeric.
At line:1 char:12
+ $numbers | measure -sum
+ ~~~~~~~~~~~~
+ CategoryInfo : InvalidType: (:PSCustomObject) [Measure-Object],
PSInvalidOperationException
+ FullyQualifiedErrorId :
NonNumericInputObject,Microsoft.PowerShell.Commands.MeasureObjectCommand
我做错了什么?
你的数组不是由数字组成,而是包含一个很长的 属性 名称(你的脚本块值)的对象,其中包含一个字符串值。
替换Select-Object
with Foreach-Object
得到值,转换为int
并计算。例如:
$numbers = gc .\numbers.txt | sls -Pattern "number\ (\d+)" | Foreach-Object {$_.matches[0].groups[1].Value -as [int] }
($numbers | measure -sum).Sum
Looks like exactly what I want to sum
不,它没有,输出有 header 行。如果它是一个简单的整数数组,那么它就不会,它会简单地显示为:
1
2
3
您创建的是一组 PowerShell objects,每个数组都有一个名为 '$_.matches[0].groups[1].Value'
的 属性。你需要这样的东西:
$numbers = gc .\numbers.txt | sls -Pattern "number\ (\d+)" | ForEach {$_.matches[0].groups[1].Value}
相反。
其他方法:
$template=@"
My number {number*:1}
My number {number*:2}
"@
#verbose version
(Get-Content C:\temp\number.txt |
ConvertFrom-String -TemplateContent $template |
measure -Sum number).Sum
#short version
(gc C:\temp\number.txt | cfs -TemplateContent $template | Measure -Sum number).Sum
假设我有一个文件 numbers.txt
:
My number 1 ... My number 2 ... My number 3 ...
我正在尝试计算以上数字的总和。我从每一行中提取了一个数字,如下所示:
PS > $numbers = gc .\numbers.txt | sls -Pattern "number\ (\d+)" |
>> select {$_.matches[0].groups[1].Value}
>>
PS > $numbers
$_.matches[0].groups[1].Value
-----------------------------
1
2
3
看起来正是我想要总结的。接下来我尝试应用测量对象:
$numbers | measure -sum
measure : Input object "" is not numeric. At line:1 char:12 + $numbers | measure -sum + ~~~~~~~~~~~~ + CategoryInfo : InvalidType: (:PSCustomObject) [Measure-Object], PSInvalidOperationException + FullyQualifiedErrorId : NonNumericInputObject,Microsoft.PowerShell.Commands.MeasureObjectCommand
我做错了什么?
你的数组不是由数字组成,而是包含一个很长的 属性 名称(你的脚本块值)的对象,其中包含一个字符串值。
替换Select-Object
with Foreach-Object
得到值,转换为int
并计算。例如:
$numbers = gc .\numbers.txt | sls -Pattern "number\ (\d+)" | Foreach-Object {$_.matches[0].groups[1].Value -as [int] }
($numbers | measure -sum).Sum
Looks like exactly what I want to sum
不,它没有,输出有 header 行。如果它是一个简单的整数数组,那么它就不会,它会简单地显示为:
1
2
3
您创建的是一组 PowerShell objects,每个数组都有一个名为 '$_.matches[0].groups[1].Value'
的 属性。你需要这样的东西:
$numbers = gc .\numbers.txt | sls -Pattern "number\ (\d+)" | ForEach {$_.matches[0].groups[1].Value}
相反。
其他方法:
$template=@"
My number {number*:1}
My number {number*:2}
"@
#verbose version
(Get-Content C:\temp\number.txt |
ConvertFrom-String -TemplateContent $template |
measure -Sum number).Sum
#short version
(gc C:\temp\number.txt | cfs -TemplateContent $template | Measure -Sum number).Sum