首页 > 解决方案 > 如何比较包含许多长字符串的两个文件,然后提取具有至少 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 可用。

标签: linuxwindowspowershelldiffstring-comparison

解决方案


给定文件的格式,最有效的实现是这样的:

  1. 将所有字符串加载b[hashtable]or[HashSet[string]]
  2. 过滤内容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

推荐阅读