Awk 查找一行代码以从文件中删除重复的多行段落

Awk 查找一行代码以从文件中删除重复的多行段落,awk,sed,grep,Awk,Sed,Grep,应返回: File: this is a paragraph to find in another file some stuff .. more stuff ... this is a paragraph to find in another file more stuff ... another paragraph to match yet more stuff.. this is a paragraph duplicate in this file anot

应返回:

File:
this is a paragraph
to find in another 
file

some stuff .. 

more stuff ... 

this is a paragraph
to find in another 
file

more stuff ... 

another paragraph 
to match

yet more stuff.. 

this is a paragraph
duplicate in this 
file

another paragraph 
to match 

this is a paragraph
duplicate in this 
file

yet more stuff..

this is a paragraph
to find in another
file
我已经找到了pcregremp-n-M,我知道我可以使用sed和这个命令循环搜索每个段落,但是pcregremp并不在每个系统上,所以如果可以避免的话,那就好了。正在寻找使用标准*nix的东西,最好不要使用perl

*一些很好的帖子和想法,但它们通常不起作用,尽管它们在我发布的有限案例中起作用,所以我调整了示例数据,以便您可以看到它是否会更普遍地起作用

*这是一个sed单行程序,只打印多行段落:

this is a paragraph
to find in another 
file

some stuff .. 

more stuff ... 

more stuff ... 

another paragraph 
to match

yet more stuff.. 

this is a paragraph
duplicate in this 
file

yet more stuff..

这主要是你想要的。唯一的问题(我马上就知道)是它将输入中的一行空行折叠为输出中的一行空行

sed -e '/./{H;$!d;}' -e 'x;/.*\n.*\n.*/!d' file
使用“如果RS设置为空字符串,则记录由空行分隔”的事实,并为awk吞下的
RS
打印额外的空行

编辑:合并@EdMorton的建议会让你得到这个

awk -v RS= '!x[$0]++{print; print ""}'
awk-vrs='!参见GNU awk的[$0]+{ORS=RT;print}'
,以保持段落之间的间距与输入一致(而不是折叠空行)

再次编辑:

这个版本似乎工作正常(GNU awk 3.1.7和更新版本,我不知道3.1.6),但有一个例外,它在文件末尾添加了一个空行

awk -v RS= -v ORS='\n\n' '!seen[$0]++'

这主要是你想要的。唯一的问题(我马上就知道)是它将输入中的一行空行折叠为输出中的一行空行

sed -e '/./{H;$!d;}' -e 'x;/.*\n.*\n.*/!d' file
使用“如果RS设置为空字符串,则记录由空行分隔”的事实,并为awk吞下的
RS
打印额外的空行

编辑:合并@EdMorton的建议会让你得到这个

awk -v RS= '!x[$0]++{print; print ""}'
awk-vrs='!参见GNU awk的[$0]+{ORS=RT;print}'
,以保持段落之间的间距与输入一致(而不是折叠空行)

再次编辑:

这个版本似乎工作正常(GNU awk 3.1.7和更新版本,我不知道3.1.6),但有一个例外,它在文件末尾添加了一个空行

awk -v RS= -v ORS='\n\n' '!seen[$0]++'

这主要是你想要的。唯一的问题(我马上就知道)是它将输入中的一行空行折叠为输出中的一行空行

sed -e '/./{H;$!d;}' -e 'x;/.*\n.*\n.*/!d' file
使用“如果RS设置为空字符串,则记录由空行分隔”的事实,并为awk吞下的
RS
打印额外的空行

编辑:合并@EdMorton的建议会让你得到这个

awk -v RS= '!x[$0]++{print; print ""}'
awk-vrs='!参见GNU awk的[$0]+{ORS=RT;print}'
,以保持段落之间的间距与输入一致(而不是折叠空行)

再次编辑:

这个版本似乎工作正常(GNU awk 3.1.7和更新版本,我不知道3.1.6),但有一个例外,它在文件末尾添加了一个空行

awk -v RS= -v ORS='\n\n' '!seen[$0]++'

这主要是你想要的。唯一的问题(我马上就知道)是它将输入中的一行空行折叠为输出中的一行空行

sed -e '/./{H;$!d;}' -e 'x;/.*\n.*\n.*/!d' file
使用“如果RS设置为空字符串,则记录由空行分隔”的事实,并为awk吞下的
RS
打印额外的空行

编辑:合并@EdMorton的建议会让你得到这个

awk -v RS= '!x[$0]++{print; print ""}'
awk-vrs='!参见GNU awk的[$0]+{ORS=RT;print}'
,以保持段落之间的间距与输入一致(而不是折叠空行)

再次编辑:

这个版本似乎工作正常(GNU awk 3.1.7和更新版本,我不知道3.1.6),但有一个例外,它在文件末尾添加了一个空行

awk -v RS= -v ORS='\n\n' '!seen[$0]++'

+1:您可以使用
-vORS=“\n\n”
而不是两个
打印
语句。尽管这可能只是一个偏好问题。@jaypal我没有想到这一点,但我没有想到
printf“%s\n\n”、$0,但我认为不值得改变使用它<代码>ORS
更干净。好主意,它对我发布的原始示例数据有效,但我正在寻找更一般的内容,我调整了示例数据。很抱歉,一开始我认为放这么长的样本数据是浪费空间。@a.Danischewski为什么
更多的东西…
更多的东西…
行显示在您想要的输出中?是什么使它们不同于
这是一个段落
?这是一个
perl
等价物
perl-00-ne'$h{${}++或print'文件
awk
也应该可以工作。您应该发布未被Etan提供的脚本过滤的数据,否则我们都只是在浪费时间。+1:您可以使用
-vORS=“\n\n”
而不是两个
打印
语句。尽管这可能只是一个偏好问题。@jaypal我没有想到这一点,但我没有想到
printf“%s\n\n”、$0,但我认为不值得改变使用它<代码>ORS
更干净。好主意,它对我发布的原始示例数据有效,但我正在寻找更一般的内容,我调整了示例数据。很抱歉,一开始我认为放这么长的样本数据是浪费空间。@a.Danischewski为什么
更多的东西…
更多的东西…
行显示在您想要的输出中?是什么使它们不同于
这是一个段落
?这是一个
perl
等价物
perl-00-ne'$h{${}++或print'文件
awk
也应该可以工作。您应该发布未被Etan提供的脚本过滤的数据,否则我们都只是在浪费时间。+1:您可以使用
-vORS=“\n\n”
而不是两个
打印
语句。虽然这可能只是偏好的问题。@jaypal我没有想到这一点,但我没有想到
prin