首页 > 解决方案 > 如何使用 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做到这一点?

标签: powershellcountuniqueuniq

解决方案


PowerShell 等效于uniq实用程序Get-Uniquecmdlet,不幸的是,它没有等效于前者的-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

推荐阅读