如何输出文本文件中最常见的字符串?

如何输出文本文件中最常见的字符串?

背景

我有一个文本文件,其中包含数据库及其条目的列表。示例文本文件:

Database 1
1. Book about abc.
2. Thesis about abc.
3. Book about xyz.

Database 2
1. Book about xyz.
2. Article about abc.

Database 3
Thesis about abc.
Article about abc.
Book about xyz.

Database 4
Number 1: Book about xyz is included.
Number 2: Article about xyz is included.

问题

我想要输出最常出现的字符串(包含最少数量的单词)。示例输出:

Name                    Count
Book about xyz          4
Thesis about abc        2

笔记

字符串出现在行内。即,这与计算行出现的次数不同。有时所需的字符串以某些内容开头和/或结尾,例如1.Number 1:有时则不以某些内容开头和/或结尾。

我尝试过的方法

我一直在使用 PowerShell。我尝试过get-content .\data.txt | group-object | where { $_.count -ne 1 }或从其他方式使用它,get-content .\data.txt | select -unique但我没有找到获取行内字符串的方法。我也研究过使用,select-string但我不知道可以定义正则表达式的模式-Pattern

答案1

这是我在 Powershell 中想到的。请告诉我你的想法

 $database = Get-content -Path c:\temp\database.txt
 $MyArrayList = New-Object -TypeName "System.Collections.ArrayList"

 foreach($line in $database){
 $flag = $false
 [Int32]$OutNumber = $null

     if ($line -match "database" -or [String]::IsNullOrWhiteSpace($line)) {
         continue

     }
     else {


          if([Int32]::TryParse($line.Substring(0,1),[ref]$OutNumber)) {
          $tmp = $line.Substring(2).trim()
          $MyArrayList.Add($tmp)
          $flag = $true

      } 



        if($line -match 'Number') {
        $tmp = $line.Substring($line.IndexOf(":")+1).trim()
        $MyArrayList.Add($tmp)
        $flag = $true


      }

       if ($flag -eq $false) {
          $MyArrayList.Add($line)

       }



   }

  }

 $MyArrayList   | Group-Object

这是我的输出

计数 名称 组
----- ---- -----
1 本关于 abc 的书。{关于 abc 的书。}
2 本关于 abc 的论文。{关于 abc 的论文。,关于 abc 的论文。}
3 本关于 xyz 的书。{关于 xyz 的书。,关于 xyz 的书。,关于 xyz 的书。}
2 本关于 abc 的文章。{关于 abc 的文章。,关于 abc 的文章。}
1 本关于 xyz 的书包括... {包括关于 xyz 的书。}
1 本关于 xyz 的文章包括... {包括关于 xyz 的文章。}

相关内容