给定一个包含段落的文件(由空行分隔的行组)。确保保留等效段落内的换行符。有没有办法uniq
删除重复的段落?
我想可以将每个段落序列化为一行,执行uniq
并反序列化结果,是否有更好的解决方案?
输入:
Paragraph1
continue
continue
...
Paragraph2
continue
continue
...
Paragraph1
continue
continue
...
Paragraph2
continue
continue
期望的输出:只有一个Paragraph1和Paragraph2。
命令行解决方案会更好。
答案1
查看awk
文档似乎我可以使用以下内容:
cat file.txt | awk 'BEGIN { RS = "\n\n+"; first = 1 } {if (!x[$0]++) { if (!first) {print ""}; print $0; first = 0} }'
快速解释:
- 我们将记录分隔符设置
RS
为“\n\n+”来分隔段落。 - 该变量
first
用于在记录之间打印换行符,或者您可以在每个 $0 之后打印换行符,但是我没有办法删除最后一条记录的换行符。 - 地图
x
用于统计该记录之前是否被看到过,只有没有被看到过,我们才会打印该记录。 - 如果不是记录
first
,我们在记录之间打印换行符 - 打印记录。
- 设置
first
为假。
答案2
$ awk -v RS= -v ORS='\n\n' '!seen[$0]++' file
Paragraph1
continue
continue
...
Paragraph2
continue
continue