Linux 如何比较包含许多长字符串的两个文件,然后提取至少有n个连续相同字符的行?

Linux 如何比较包含许多长字符串的两个文件,然后提取至少有n个连续相同字符的行?,linux,windows,powershell,diff,string-comparison,Linux,Windows,Powershell,Diff,String Comparison,我有两个大文件,每个文件都包含由不同格式的换行符分隔的长字符串。我需要找出它们之间的相同点和不同点。问题是这两个文件的格式不同 文件a: 9217:NjA5MDAxNdaeag0NjE5NTIx.xuxrq.gat8MzuGfkj2pWs7z8z LBFXQaE:dasda97sda9sdadfghgg789hfg87ghf8fghh87 文件b: NjA5MDAxNdaeag0NjE5NTIx.XUwXRQ.gat8MzuGfkj2pWs7z8z-LBFXQaE 因此,现在我想将包含nja

我有两个大文件,每个文件都包含由不同格式的换行符分隔的长字符串。我需要找出它们之间的相同点和不同点。问题是这两个文件的格式不同

文件a:

9217:NjA5MDAxNdaeag0NjE5NTIx.xuxrq.gat8MzuGfkj2pWs7z8z LBFXQaE:dasda97sda9sdadfghgg789hfg87ghf8fghh87
文件b:

NjA5MDAxNdaeag0NjE5NTIx.XUwXRQ.gat8MzuGfkj2pWs7z8z-LBFXQaE
因此,现在我想将包含
nja5mdaxndageag0nje5ntix.XUwXRQ.gat8MzuGfkj2pWs7z8z LBFXQaE的整行代码从文件a提取到一个新文件,并在文件a中删除这一行

我已经试着用meld实现了这一点,并得出这样的结论:它至少会让我看到相似之处。假设文件a有3000行,文件b有120行,现在我想找到至少有n个连续相同字符的行,并从文件a中删除它们

我发现并尝试像这样使用diff:

diff--未更改的行格式='%1'--旧行格式=''\
--新行格式=“”a.txt b.txt
这没有做任何事情,我没有得到任何输出,所以我猜它退出0,没有找到任何东西


我怎样才能做到这一点?我有Linux和Windows可用。

鉴于文件的格式,最有效的实现方式如下:

  • 将所有
    b
    字符串加载到
    [hashtable]
    [HashSet[string]]
  • 通过以下方式过滤
    a
    的内容:
    • 使用
      String.Split(“:”)
      或类似工具从每行提取子字符串
    • 检查步骤1中的集合中是否存在

  • 因此,文件
    b
    包含120个字符串,您想从文件
    a
    中删除包含120个字符串中的任何一个作为子字符串的行吗?这正是我正在尝试的。文件
    a
    字符串的格式总是相同的?例如,
    [一些文本或数字]:[来自b的潜在子字符串]:[更多文本或数字]
    ?是的,事实就是这样。尽管需要考虑更多的
    分隔符可能跟在
    [8549]:[NjA4NzMyedea212RELEVANTSUBSTRING5zz-JqDtvpAIkZq8oLiX2cBVI]:[irrelevantstring]:[irrelevantstring]:[irrelevantstring]:[irrelevantstring]
    我再次检查了附加的
    始终跟在后面,因此上述结构对文件中的所有条目都有效
    $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