powershell - 如何使用 powershell 计算文件中的连续字符串?
问题描述
所以我想知道如何从文件中获取内容并计算该文件中字符串的连续出现次数?所以我的文件有以下字符串:
1
1
1
0
0
0
0
1
1
1
0
1
1
0
0
0
1
0
1
1
1
0
0
现在问题是我对 powershell 几乎一无所知,但知道 bash,所以如果有人同时理解这两者,这就是我想要的效果:
[me@myplace aaa8]$ cat fule1|uniq -c
3 1
4 0
3 1
1 0
2 1
3 0
1 1
1 0
3 1
2 0
如果可能的话,还添加相当于sort -hr
:D的 powershell
[me@myplace aaa8]$ cat fule1|uniq -c|sort -hr
4 0
3 1
3 1
3 1
3 0
2 1
2 0
1 1
1 0
1 0
所以基本上它的作用是告诉我我拥有的文件有最长的 4 个零等。
有没有办法用powershell做到这一点?
解决方案
PowerShell 等效于uniq
实用程序Get-Unique
cmdlet,不幸的是,它没有等效于前者的-c
选项来添加连续重复行的数量(从 PowerShell v6.2 开始)。
注意:增强Get-Unique
以支持POSIX 实用程序-c
提供的类似功能和其他功能是GitHub 上此功能请求的主题。uniq
因此,您必须推出自己的解决方案:
function Get-UniqueWithCount {
begin {
$instanceCount = 1; $prevLine = $null
}
process {
if ($_ -eq $prevLine) {
++$instanceCount
} elseif ($null -ne $prevLine) {
[pscustomobject] @{ InstanceCount = $instanceCount; Line = $prevLine }
$instanceCount = 1
}
$prevLine = $_
}
end {
[pscustomobject] @{ InstanceCount = $instanceCount; Line = $prevLine }
}
}
$_
上述函数接受来自管道的输入(如块中的逐个对象 process { ... }
)。它将每个对象(行)与前一个对象(行)进行比较,如果它们相等,则增加实例计数;一旦找到不同的行,就会输出前一行及其实例计数,作为具有属性InstanceCount
和的对象Line
。该end { ... }
块输出相同连续行的最后一个块的最终输出对象。请参阅about_Functions_Advanced。
然后按如下方式调用它:
Get-Content fule | Get-UniqueWithCount
产生:
InstanceCount Line
------------- ----
3 1
4 0
3 1
1 0
2 1
3 0
1 1
1 0
3 1
2 0
由于Get-UniqueWithCount
方便地输出我们可以操作其类型属性的对象,因此(按嵌入数字排序(),降序(反向)顺序( ))的等价物很容易: sort -hr
-h
-r
Get-Content fule | Get-UniqueWithCount | Sort-Object -Descending InstanceCount
产生:
InstanceCount Line
------------- ----
4 0
3 1
3 1
3 0
3 1
2 1
2 0
1 0
1 1
1 0
推荐阅读
- python - 带有交互式按钮和下拉菜单的 Plotly-Dash 应用程序
- ios - 如何在控制台中快速获取错误消息以在 UI 中进行验证?
- python-2.7 - 在 Google Cloud 中部署 Python 应用程序时如何处理打开文件的路径?
- c++ - 必须重新定义一些 kext 成员函数,以避免未解析的符号
- javascript - Javascript数组在不知道父键的情况下获取所有子值
- css - 在 JavaFX 中动态设置背景和字体的首选方法
- angular - 编写 Object.Object.Method 的最佳实践
- c++ - 获取通用/前向引用的地址有什么意义?
- c++ - 如何在 Windows NT 驱动程序中获取符号链接名称?
- python - 重构代码时出现烧瓶迁移问题