如何使用powershell计算文件中的连续字符串?

如何使用powershell计算文件中的连续字符串?,powershell,count,unique,uniq,Powershell,Count,Unique,Uniq,因此,我想知道如何从文件中获取内容,并计算该文件中字符串的连续出现次数? 因此,我的文件具有以下字符串: 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

因此,我想知道如何从文件中获取内容,并计算该文件中字符串的连续出现次数? 因此,我的文件具有以下字符串:

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
实用程序,不幸的是,没有与前者的
-c
选项
等效的方法来预先设置连续重复行数(从powershell v6.2开始)

注意:增强
Get Unique
以支持类似
-c
-like的功能以及由提供的其他功能是本主题

因此,您必须推出自己的解决方案:

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 }
  }

}
上述函数接受来自管道的输入(在
进程{…}
块中,对象按对象显示为
$\ucode>)。
它将每个对象(线)与前一个对象(线)进行比较,如果它们相等,则增加实例计数;一旦找到不同的行,前一行连同其实例计数一起作为具有属性
InstanceCount
line
的对象输出。
end{…}
块输出相同连续行的最后一个块的最终输出对象。 看

然后按如下方式调用它:

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
InstanceCount Line
------------- ----
            4 0
            3 1
            3 1
            3 0
            3 1
            2 1
            2 0
            1 0
            1 1
            1 0
由于
Get UniqueWithCount
可以方便地输出我们可以对其类型化属性进行操作的对象,因此以降序(反向)排列(
-r
)的
sort-hr
(按嵌入的数字排序)(
-h
)的等效方法很简单:

这将产生:

InstanceCount Line
------------- ----
            3 1
            4 0
            3 1
            1 0
            2 1
            3 0
            1 1
            1 0
            3 1
            2 0
InstanceCount Line
------------- ----
            4 0
            3 1
            3 1
            3 0
            3 1
            2 1
            2 0
            1 0
            1 1
            1 0

可以是这样的:
[regex]::匹配('aaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbccc',“()\1+”).Groups | Where Object{$\长度-gt 1}|排序对象-唯一-属性值
[RegexOptions]:多行
任务选项组合<代码>测量对象
命令也可能有用。我不确定您的输入数据大小以及正则表达式的工作速度。@Rabash:
uniq-c
不排除单个实例,因此您的解决方案无法工作。一般来说,未来的读者从完整的答案中获益最多,而不是评论中的(半)解决方案