Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Bash:减少大文件中的长时间重复模式,包括多行模式_Regex_Bash_Awk_Sed - Fatal编程技术网

Regex Bash:减少大文件中的长时间重复模式,包括多行模式

Regex Bash:减少大文件中的长时间重复模式,包括多行模式,regex,bash,awk,sed,Regex,Bash,Awk,Sed,我有大的文本文件(Reddit转储),我的文本挖掘程序的一个模块在遇到长时间重复模式时崩溃(见下文)。我知道这个问题很复杂,最好使用多个命令来解决。我想减少这些重复,即只留下一个例子:“AA”->“AA” 以下是导致问题的字符串(请原谅我的政治和淫秽,这是真实数据的示例-我已经清理了最坏的部分): 模式可以由任何符号组成。最糟糕的是多行模式,如: r r r r 或 我尝试的是: 我为一行中的重复编写的正则表达式在grep中工作,但在sed中没有多大帮助,并且挂起了一些原因:sed-E“s/(

我有大的文本文件(Reddit转储),我的文本挖掘程序的一个模块在遇到长时间重复模式时崩溃(见下文)。我知道这个问题很复杂,最好使用多个命令来解决。我想减少这些重复,即只留下一个例子:“AA”->“AA”

以下是导致问题的字符串(请原谅我的政治和淫秽,这是真实数据的示例-我已经清理了最坏的部分):

模式可以由任何符号组成。最糟糕的是多行模式,如:

r
r
r
r

我尝试的是:

我为一行中的重复编写的正则表达式在grep中工作,但在sed中没有多大帮助,并且挂起了一些原因:
sed-E“s/(.{4,}?)\1+/\1/g”test.txt

长的单字符模式“GGGGG…”可以通过以下方式解决:
sed's/\(.\)\1\+/\1/g'test.txt
,但我不能在这里设置最小重复限制

我发现这样的代码可以减少单个重复行:
sed'$!N/^\(.\)\n\1$/!PD'test.txt
,但我不能在那里设置最小限制

这个问题也是最后一个例子。当然,在内存中保留太长的多行窗口可能会非常慢,但我至少可以有一个参数来减少重复模式,比如说,最多三行或四行吗


编辑:我想要实现的示例:

输入示例:

RegExr v3 was created by gskinner.com, and is proudly hosted by Media Temple.

HAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHA
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG

Edit the Expression & TextTextTextTextText to TATATATATA see $$$$$$$$$ matches. X X X X X X X X Roll over matches or the expression lolk lolk lolk lolk
lolk
r
r
r
r
r
RADA
RADA
RADA
RADA

JOHN01
BAD
JOHN01
BAD
JOHN01
BAD
JOHN01
BAD

r

Here is some more good text.

ONE TWO ONE TWO ONE TWO ONE TWO ONE TWO ONE TWO ONE TWO ONE TWO ONE TWO

sumyeonjesumyeonjesumyeonjesumyeonjesumyeonjesumyeonjesumyeonjesumyeonje


This is also a good text, but repeated. This is also a good text, but repeated. This is also a good text, but repeated. 

Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
以下是我希望如何清理语料库(理想情况):


EDIT2:只要我只想消除程序崩溃的情况,我认为最小的重复元素就足以检查:

HAHAHA_2_HAHAHA_2_HAHAHA_2 -> HA_2_HA_2_HA_2
如果在那之后出现问题,我会记住这个可能的原因,然后再进行第二次清洗

如果我在首次清理单词后运行重复行的清理,那么一切都应该正常:

HAHAHAHAHA            HA         HA
RADARADA              RADA       RADA
HAHAHAHAHA     --->   HA    --->
RADARADA              RADA

您可能需要多种策略,因为重复的行
uniq
将起作用 对于两行重复,您可以合并行并对结果运行
uniq
。比如说

$ cat repeat_line2

01
00
01
00
01
00
01
00

$ awk '{ORS=NR%2?FS:RS}1' repeat_line2 | uniq
01 00
对于同一行上的重复单词,可以应用反向操作。在运行
uniq

$ cat repeat_words
AA AA AA AA
CC BB CC BB


$ sed 1G repeat_words    |  # double space lines
  tr ' ' '\n'            |  # break words into new lines
  uniq                   |  # remove repeated words
  awk '{ORS=NR%2?FS:RS}1'|  # join two lines
  uniq                      # remove repeated two-words
将给予

AA
CC BB
您可以在一个
awk
脚本中实现所有这些,但我认为使用专用命令将更容易调试/改进。

这可能是一个开始(GNU-sed):


这将删除重复的行,并将重复的单词减至最少。

每个单词的顺序和行号是否重要?如果不是,那么有一个非常简单的解决方案。@Socowi我正在做词性标注,所以是的。“I clear ball”->“PRP,JJ,NN”。手册页本身告诉您,
-P
是“高度实验性”的,您可以在使用时搜索其他grep崩溃的例子,该选项已从某些grep版本中删除,因此您得到的结果与预期的结果非常接近!如果你发布了一个简洁、可测试的示例输入和预期输出,那么我相信有人可以帮助你以一种非“高度实验性”的方式解决问题。wrt
我不能在那里设置最小重复限制
-当然可以:
sed-E'/X{3,5}/“
会找到3到5个X。我最后一句话希望能让我明白,至少我认为你的要求不够明确:在你发布的例子中,
TATA…
为什么会变成
TA
,但
gskinner.com
不会变成
gskiner.com
(重复
n
)?为什么
good
不能成为
上帝
(重复
o
)?为什么
这也是
变成
这也是
(重复
)?为什么输出中存在
lolk\nlolk
?很有趣。我曾想过各种可能的解释OP试图做什么,但没有一个是上面提到的。不是说你错了,我真的不知道。特别是我认为,
01 00 01…
多行字符串是OP想要查找重复的单个字符串。@EdMorton Np,最大的问题确实是多行重复。非常感谢您的解决方案!据我所知,您建议删除换行符并切换到单线情况。我也在考虑这个解决方案,但我想知道它对输出的质量有多大影响——这对我使用的程序是否重要。因此,如果可能的话,我想保留换行符。我还想保留实际的文本含义(我正在从文本中挖掘有意义的关键短语,使用词性标记和其他东西),因此,文本上的
uniq
似乎太激进了,它将转换为“单词包”。我的实际数据是reddit dumps,类似于“”Pottong你的sed一行是纯金的,但我很难理解。介意我请你详细解释一下吗?(仅sed部分)@Forge替换命令被放置在一个循环中,该循环将重复执行,直到失败。替换的LHS尝试匹配一组单词,后面跟一个空格,后面跟上一组单词的重复。它是贪婪的,所以匹配最长的字符串。它一直运行,直到没有找到重复,然后
uniq
命令删除任何重复的连续行。
$ cat repeat_line2

01
00
01
00
01
00
01
00

$ awk '{ORS=NR%2?FS:RS}1' repeat_line2 | uniq
01 00
$ cat repeat_words
AA AA AA AA
CC BB CC BB


$ sed 1G repeat_words    |  # double space lines
  tr ' ' '\n'            |  # break words into new lines
  uniq                   |  # remove repeated words
  awk '{ORS=NR%2?FS:RS}1'|  # join two lines
  uniq                      # remove repeated two-words
AA
CC BB
sed -r ':a;s/((\b|[[:punct:]]).+)\s*\1/\1/;ta' file | uniq