【问题标题】:Find and KEEP all DUPLICATE lines (instead of unique lines) in a text file在文本文件中查找并保留所有 DUPLICATE 行(而不是唯一行)
【发布时间】:2018-03-25 10:27:13
【问题描述】:

我的目标是识别并保留 DUPLICATE、TRIPLICATE 等行,即在 Notepad++ 中多次出现的所有行?换句话说,我怎样才能只删除所有唯一的行?

例如,这里有七 (7) 个单独的列表以及每个列表所需的真实重复行(显示为 7 列,将每列视为单独的列表或文件!)。 (这里的列表并排显示只是为了节省空间,在现实生活中,7 个列表中的每一个都单独出现,独立于其他列表,并且是单独的文件!)

list1  list2  list3  list4  list5  list6  list7
1      0      0      0      0      0      0
2      1      1      1      1      1      1
3      2      2      2      2      2      2
4      3      3      3      3      3      3
4      4      4      4      4      4      4
4      4      4      4      4      4      4
5      4      4      4      4      4      4
6      5      5      5      5      5      5
7      5      5      5      5      5      5
8      6      6      6      6      6      6
9      6      6      6      6      6      6
abc    7      7      7      7      7      7
abd    8      8      8      8      8      8
abd    9      9      9      9      9      9
abe           <CR>   9      9      9      9
                            <CR>   99     99
                                          <CR>

[Lines of multiple occurence of above lists:]         
4      4      4      4      4      4      4
4      4      4      4      4      4      4
4      4      4      4      4      4      4
abd    5      5      5      5      5      5
abd    5      5      5      5      5      5
       6      6      6      6      6      6
       6      6      6      6      6      6
                     9      9      9      9
                     9      9      9      9

消除重复的解决方案有很多(例如,TextFX;notepad++ delete duplicate and original lines to keep unique lines),我找不到保留重复的解决方案。

((.*)\R(\2\R)+)*\K.+\R @Lars Fischer:这个脚本几乎可以正常工作,除了(预排序的)列表的最后一个条目需要是唯一行,后跟 &lt;CR&gt; 空行。一种(次优)解决方法是插入一个人工(辅助)唯一行(例如 zzz),然后插入一个空行 &lt;CR&gt; 作为最后两行。

(问题结束)


更新 3:此问题根据 stackoverflow "ask a new question" 指令重新发布。 (@AdrianHHH@B. Desai@Paolo Forgia@greg-449@Erik von Asmuth 得出错误结论,即该问题与notepad++ delete duplicate and original lines to keep unique lines 重复。此问题绝对不是@AdrianHHH 等问题的重复引号。

更新 2:@AdrianHHH 这个问题并不比其他 Notepad++ 问题更“广泛”(事实上,几乎不可能更具体)或研究更少,包括@AdrianHHH 引用的https://stackoverflow.com/questions/29303148(错误地)等。作为同一个问题。

更新: @AdrianHHH, @B. Desai, @Paolo Forgia, @greg-449, @Erik von Asmuth 这个问题不同于: https://stackoverflow.com/questions/29303148 因为 Q 29303148(i) 既没有询问如何识别和只保留多次出现的行,(ii) 也没有在答案中提供解决方案那。 Q 29303148 问“...我只需要独特的线条。”

【问题讨论】:

    标签: list sorting text duplicates notepad++


    【解决方案1】:

    这是一个基于正则表达式和书签的解决方案,它适用于排序文件(即每个重复的行后面跟着它的重复):

    • 打开标记对话框(搜索 -> 标记 ....)
    • 点击右侧的清除所有标记
    • 检查书签行
    • 检查环绕
    • 查找内容: ((.*)\R(\2\R?)+)*\K.*
    • 选中正则表达式并取消选中. matches newline
    • 全部标记
    • 点击关闭
    • 搜索 -> 书签 -> 删除带书签的行

    说明

    正则表达式由三部分组成:

    • ((.*)\R(\2\R?)+)*:这是一个可选的重复块,由一个或多个行块组成

      • 外部( ... )* 匹配零个或多个这样的重复行块(如果在您的示例中,三个 4 后面跟着两个 5,我们将需要一个重复块序列的概念)
      • (.*)\R(\2\R?)+\2引用(.*)的内容:这都是一行的重复
      • 第二个\R 是可选的(由于?)换行符。因此,如果该行不以换行符结尾,则可以匹配文件最后一行中的重复项

      如果在你开始的光标位置之后有一块重复的行,这将匹配它。

    • 现在\K 丢弃我们迄今为止匹配的内容(重复项)并“将光标”放在第一个唯一行之前

    • .* 匹配下一个(唯一)行并将其添加到书签

    使用全部标记,我们为所有这些独特的行添加书签,以便我们可以使用“搜索”->“书签”菜单中的条目来删除它们。

    【讨论】:

    • 不错的一个。但不要忘记取消选中. matches newline
    • @Toto 谢谢,我已经包含了你的提示。
    • ((.*)\R(\2\R)+)*\K.+\R 如果: 已排序 列表的最后两行或多行包含重复项,它将不起作用。一种(次优)解决方法是插入人工(辅助)unique 行(例如,zzz),然后插入一个空行(carriage return)作为最后两行。
    • ((.*)\R(\2\R)+)*\K.+\R 您需要一个空行 (carriage return) 作为手动插入的最后一行,即使 sorted 列表以 unique 行结尾.否则它将保留有效重复列表中的最后一个唯一行。 (可能与正则表达式的行尾字符识别有关?)
    • @user3026965 感谢您的解释。您可能想尝试正则表达式((.*)\R(\2\R?)+)*\K.*。它不再需要最后一行中的最后一个换行符,它适用于您的第三条评论中没有好的情况。它应该特别适用于列表末尾的重复项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 2015-11-03
    • 1970-01-01
    • 2013-06-08
    • 2016-06-10
    • 1970-01-01
    相关资源
    最近更新 更多