我正在尝试处理一个充满文件的目录。
我想在文件中找到特定的行, 从这些行中提取一个数值 他们将所有这些值汇总到一个目录中。
看起来像这样......
File1.txt
bread:123
ham:456
eggs:789
File2.txt
bread:999
mayo:789
eggs:123
等等……
我想找到有鸡蛋的行,提取数字,然后跨文件将这些数字加在一起。
我从其他帖子中找到了这个脚本,但它只是片段,我仍然无法理解如何使用和管道/变量/大括号。
dir . -filter "*.txt" -Recurse -name | foreach{(GC $_).Count} | measure-object -sum
#?
Get-Content | Select-String -Pattern "eggs*"
#?
$record -split ":"
我希望脚本说“eggs = 912”,即 123 + 789 = 912
最佳答案
这是一个可能的解决方案:
$pattern = 'eggs'
$sum = Get-ChildItem . -File -Recurse -Filter *.txt |
Get-Content |
Where-Object { $_ -match $pattern } |
ForEach-Object { ($_ -split ':')[1] } |
Measure-Object -Sum |
ForEach-Object Sum
"$pattern = $sum"
输出:
eggs = 912
Get-ChildItem
递归查找所有匹配过滤器的文件Get-Content
读取每个文件的每一行并将其传递到管道中Where-Object
仅包含与给定 RegEx 模式匹配的行ForEach-Object
行在:
处拆分行并提取位于数组索引[1]
处的子字符串。Measure-Object
累积所有数字(如有必要,它将字符串转换为double
)。在内部,它在其begin
block 中创建一个变量,在其process
block 中累积对该变量的管道输入,并在其end
中输出变量值> 阻止。- 最后
ForEach-Object
行是必要的,因为Measure-Object
实际上输出一个具有Sum
属性的对象,但我们只想要该属性的值,而不是整个对象。如果要删除该行,则必须编写"$pattern = $($sum.Sum)"
来访问的
对象。Sum
属性>求和
关于Powershell脚本仅对文件中的特定记录求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73080843/