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

时间:2019-03-23 22:12:40

标签: 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
      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做到这一点?

1 个答案:

答案 0 :(得分:1)

PowerShell与uniq实用程序Get-Unique cmdlet等效,遗憾的是,它不与前者的-c选项等效。 重复的行(自PowerShell v6.2起)。

注意:增强Get-Unique以支持类似-c的功能以及uniq POSIX utility提供的其他功能是此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 }
  }

}

上面的函数接受来自管道的输入($_块中的对象{@ 1}})。 它将每个对象(线)与上一个对象(线)进行比较,如果相等,则增加实例计数;找到不同的行后,将输出前一行及其实例计数作为对象,其属性为process { ... }InstanceCountLine块输出相同连续行的最后一块的最终输出对象。 参见about_Functions_Advanced

然后按如下所示调用它:

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 可以方便地输出我们可以对其执行类型化 properties 对象,因此等效于Get-UniqueWithCount(按嵌入数字(sort -hr)降序(-h)排序很容易:

-r

产生:

Get-Content fule | Get-UniqueWithCount | Sort-Object -Descending InstanceCount