如何从Powershell中的.txt文件中获得一行的总和?

时间:2019-12-08 14:06:14

标签: powershell text-parsing

因此,我有一个文本文件“ 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
 }

但是它会返回奇怪的数字。 我不知道如何将每一行中的不同数字分开并求和。

2 个答案:

答案 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