本文介绍了在不排序的情况下删除特定重复行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个大约5000行的文本文件,我必须删除特定的重复行(不包含单词"niveau"或"stime"),但保留第一个出现项,并且不排序,文本模式如下所示:
vide vide Time: stime 3:30 PM vide vide
NN NN NP stime LS NP NN NN
----------Niveau 1--------------
Time: | 0 | 263.0 | 266.0 | 0,0113
NP | 0 | 0.0 | 24885.0 | 1
3:30 | -0 | 104.0 | 120.0 | 0,1333
LS | -0 | 0.0 | 13134.0 | 1
PM | -1 | 134.0 | 238.0 | 0,437
NP | -1 | 0.0 | 24885.0 | 1
----------Niveau 2--------------
3:30 PM | -0 | 30.0 | 41.0 | 0,2683
3:30 NP | -0 | 133.0 | 55.0 | -1,4182
LS PM | -0 | 42.0 | 237.0 | 0,8228
LS NP | -0 | 0.0 | 2456.0 | 1
----------Niveau 3--------------
vide vide Time: stime 3:30 pm vide vide
NN NN NP stime LS NN NN NN
----------Niveau 1--------------
Time: | 0 | 263.0 | 266.0 | 0,0113
NP | 0 | 0.0 | 24885.0 | 1
3:30 | -0 | 104.0 | 120.0 | 0,1333
LS | -0 | 0.0 | 13134.0 | 1
pm | -1 | 38.0 | 54.0 | 0,2963
NN | -1 | 0.0 | 59511.0 | 1
----------Niveau 2--------------
3:30 pm | -0 | 9.0 | 9.0 | 0
3:30 NN | -0 | 36.0 | 24.0 | -0,5
LS pm | -0 | 22.0 | 52.0 | 0,5769
LS NN | -0 | 0.0 | 2658.0 | 1
----------Niveau 3--------------
预期结果:
vide vide Time: stime 3:30 PM vide vide
NN NN NP stime LS NP NN NN
----------Niveau 1--------------
Time: | 0 | 263.0 | 266.0 | 0,0113
NP | 0 | 0.0 | 24885.0 | 1
3:30 | -0 | 104.0 | 120.0 | 0,1333
LS | -0 | 0.0 | 13134.0 | 1
PM | -1 | 134.0 | 238.0 | 0,437
NP | -1 | 0.0 | 24885.0 | 1
----------Niveau 2--------------
3:30 PM | -0 | 30.0 | 41.0 | 0,2683
3:30 NP | -0 | 133.0 | 55.0 | -1,4182
LS PM | -0 | 42.0 | 237.0 | 0,8228
LS NP | -0 | 0.0 | 2456.0 | 1
----------Niveau 3--------------
vide vide Time: stime 3:30 pm vide vide
NN NN NP stime LS NN NN NN
----------Niveau 1--------------
pm | -1 | 38.0 | 54.0 | 0,2963
NN | -1 | 0.0 | 59511.0 | 1
----------Niveau 2--------------
3:30 pm | -0 | 9.0 | 9.0 | 0
3:30 NN | -0 | 36.0 | 24.0 | -0,5
LS pm | -0 | 22.0 | 52.0 | 0,5769
LS NN | -0 | 0.0 | 2658.0 | 1
----------Niveau 3--------------
通过使用Notepad++和TextFX插件,我隐藏了包含单词"niveau"和"stime"的行,然后在this post中的第二个解决方案中建议的搜索和替换对话框中使用此正则表达式^(.*?)$s+?^(?=.*^1$)
,当我单击全部替换时,它会删除所有行,我得到一个空白文件文本,我是否做错了什么?
推荐答案
您需要脚本功能,因为无法删除
重复行,但不将匹配位置提升到该行。
因此,您必须坐在一个循环中,从
的开头重新开始字符串,直到删除所有DUP。
示例Perlwhile ( str ~= s/regex/$1/g ) {}
这是可以做到的。可能要多花点时间,但这是可行的。
无论如何,这是您执行此操作所需的正则表达式。
全局:
查找(?m)((^[^S]*?(?=S)(?:(?!Niveau|stime).)+$)[Ss]*?)^2$(?:?)?
替换$1
执行此操作,直到全局没有更多匹配(即更换)
解释:
(?m) # Multi-line mode
( # (1 start), To be written back
( # (2 start), The line to test
^ # BOL begin of line
[^S
]*? # Spurious horizontal whitespace
(?= S ) # Must be a non-whitespace ahead
(?: # Skip lines containing these
(?! Niveau | stime )
.
)+
$ # EOL end of line
) # (2 end)
[Ss]*? # Anything up to the duplicate
) # (1 end)
^ 2 $ # The actual duplicate line
(?:
?
)? # Optional linebreak (if last line, then ok)
请注意,按照正则表达式现在的方式,不会修剪水平空格
在BOL和EOL,因此文本必须准确。
不过,如果需要可以添加一些额外的装饰,这很容易。
更新
上述正则表达式的更快版本使用K
结构来简化接替者。全局:
查找(?m)(^[^S]*?(?=S)(?:(?!Niveau|stime).)+$)[Ss]*?K^1$(?:?)?
替换""(不替换)
已解释
(?m) # Multi-line mode
( # (1 start), The line to test
^ # BOL begin of line
[^S
]*? # Spurious horizontal whitespace
(?= S ) # Must be a non-whitespace ahead
(?: # Skip lines containing these
(?! Niveau | stime )
.
)+
$ # EOL end of line
) # (1 end)
[Ss]*? # Anything up to the duplicate
K # Disregard the match up to here
^ 1 $ # The actual duplicate line to be deleted
(?:
?
)? # Optional linebreak (if last line, then ok)
这篇关于在不排序的情况下删除特定重复行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!