背景
我有一个文本文件,其中包含数据库及其条目的列表。示例文本文件:
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 的文章。}