linux - 如何比较包含许多长字符串的两个文件,然后提取具有至少 n 个连续相同字符的行?
问题描述
我有 2 个大文件,每个文件都包含由不同格式的换行符分隔的长字符串。我需要找到它们之间的相同点和不同点。问题是两个文件的格式不同。
文件一:
9217:NjA5MDAxNdaeag0NjE5NTIx.XUwXRQ.gat8MzuGfkj2pWs7z8z-LBFXQaE:dasda97sda9sdadfghgg789hfg87ghf8fgh87
文件 b:
NjA5MDAxNdaeag0NjE5NTIx.XUwXRQ.gat8MzuGfkj2pWs7z8z-LBFXQaE
所以现在我想将包含NjA5MDAxNdaeag0NjE5NTIx.XUwXRQ.gat8MzuGfkj2pWs7z8z-LBFXQaE
文件 a 的整行提取到一个新文件中,并在文件 a 中删除这一行。
我已经尝试通过融合来实现这一点,并达到了它至少只会向我展示相似之处的地步。假设文件 a 有 3000 行,文件 b 有 120 行,现在我想找到至少有 n 个连续相同字符的行,并将它们从文件 a 中删除。
我发现了这一点,因此尝试像这样使用 diff:
diff --unchanged-line-format='%L' --old-line-format='' \
--new-line-format='' a.txt b.txt
这没有做任何事情我没有任何输出,所以我猜它以 0 退出并且没有找到任何东西。
我怎样才能使这项工作?我有 Linux 和 Windows 可用。
解决方案
给定文件的格式,最有效的实现是这样的:
- 将所有字符串加载
b
到[hashtable]
or[HashSet[string]]
- 过滤内容
a
:String.Split(':')
从具有或相似的每一行中提取子字符串- 从步骤 1 检查它是否存在于集合中
$FilterStrings = [System.Collections.Generic.HashSet[string]]::new(
[string[]]@(
Get-Content .\path\to\b
)
)
Get-Content .\path\to\a |Where-Object {
# Split the line into the prefix, middle, and suffix;
# Discard the prefix and suffix
$null,$searchString,$null = $_.Split(":", 3)
if($FilterStrings.Contains($searchString)){
# we found a match, write it to the new file
$searchString |Add-Content .\path\to\matchedStrings.txt
# make sure it isn't passed through
$false
}
else {
# substring wasn't found to be in `b`, let's pass it through
$true
}
} |Set-Content .\path\to\filteredStrings.txt
推荐阅读
- excel - vba如何在将条形码扫描到文本框后自动插入表格
- spring - How to set enableLoggingRequestDetails='true' in Spring Boot
- schema - 无法将 mondrian 4 模式文件转换为 mondrain 3.x 模式文件
- python-3.x - python 3 hashlib.sha256().update(newcontent) 似乎不会覆盖旧内容
- ruby - 无法使用 ruby 2.4.5 在 AIX 7.1 上安装 ruby gems
- ios - ios swift MPMediaItemArtwork requestHandler 从 SDWebImage 返回图像
- google-api - 如何通过 API 以编程方式启用服务帐户中的“启用 G Suite 域范围委派”复选框
- javascript - 使画布拉伸以适合图像
- javascript - 如何检查 URL 是否与当前页面和/或工作人员的来源相同
- cordova - 离子 3 本地地理编码器。找不到“thoroughfare”、“subThoroughfare”