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

How do you count consecutive strings in file using 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 以支持 -c 类功能和 uniq POSIX utility is the subject of this feature request on GitHub 提供的其他功能。

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

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 { ... } 块中逐个对象作为 $_)。 它将每个对象(行)与前一个对象(行)进行比较,如果它们相等,则增加实例计数;一旦找到不同的行,就会输出上一行及其实例计数,作为具有属性 InstanceCountLine 的对象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 方便地输出 objectstyped properties 我们可以采取行动上,等价于 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