因此,我有一个文本文件“ numbers.txt”,如下所示:
2 3 4 5
5 6
6 7 7
6 88 9 67 4
65 76 979 8
6 88 5 4 23
我的问题是,我怎么能得到每一行的总和? 我想做的事:
$data=Get-Content -Delimiter " " numbers.txt
$data | % {
$sum=0
foreach($num in $_) {
$sum+=$num
}
Write-Host $sum
}
但是它会返回奇怪的数字。 我不知道如何将每一行中的不同数字分开并求和。
答案 0 :(得分:1)
这是利用LINQ的快速简洁的PSv4 +解决方案:
(Get-Content numbers.txt).ForEach({
[Linq.Enumerable]::Sum([int[]] ($_ -split ' '))
})
(Get-Content numbers.txt)
返回输入文件的行作为字符串数组。
.ForEach({ ... }
)为每个输入行执行一个脚本块({ ...}
)。
[Linq.Enumerable]::Sum(...)
对数字数组(可枚举)的元素求和。
$_ -split ' '
用空格将手边的输入行($_
)分割为(字符串)标记,并将结果转换为 integers ({ {1}}。
这是一个-较慢的解决方案-更接近您的尝试(在PSv3-中也适用):
[int[]]
两种解决方案均产生以下结果:
Get-Content numbers.txt | ForEach-Object { # Process each line.
$sum = 0 # initialize the sum (implicitly of type [int])
foreach ($num in $_ -split ' ') { # Process all tokens on the line.
# Note: Because $sum is [int]-typed, adding the *string* token at
# hand implicitly converts it to [int].
$sum += $num
}
$sum # Output the sum - do NOT use Write-Host to output DATA
}
关于您尝试过的事情:
14 # 2 + 3 + 4 + 5 11 # 5 + 6 20 # ... 174 1128 126
这会将您的整个文件分成一个数字字符串的单个数组,而忽略行边界。
相反,必须按原样使用Get-Content -Delimiter " " numbers.txt
才能逐行处理文件 ,然后将每行拆分为以空格分隔的标记总结一下。
答案 1 :(得分:0)
将其转换为单个数字数组:
-split (get-content numbers.txt) | measure -sum | % sum
1473
糟糕,将每一行相加:
get-content numbers.txt | foreach { -split $_ | measure -sum } | foreach sum
14
11
20
174
1128
126