如果下一行相同则删除行


15

我可以使用什么sed / awk命令?只是sort -u将删除所有实例

输入:

abc
abc
def
abc
abc
def

预期产量:

abc
def
abc
def

Answers:


36

这就是uniq标准命令的用途。

uniq your-file

请注意,uniq像GNU之类的某些实现uniq将为您提供一系列行排序的第一行,这些排序相同(此处strcoll()返回0),而不是逐字节相同(其中memcmp()strcmp()返回0)。要强制进行字节对字节的比较而不考虑其uniq实现,可以使用以下命令强制执行区域设置C

LC_ALL=C uniq your-file

7

Vim可以很好地做到这一点:

:g/\v^(.*\n)\1/d

或者,如果您更愿意将vim用作命令行工具,则可以按照以下步骤进行操作:

vim file -c "g/\v^(.*\n)\1/d" -c "wq"

这样,您不必为以后退出vim费力;)

说明:

:g/

在与此正则表达式匹配的所有行上...

\v^(.*\n)\1

紧随其后的任何一行...

/d

运行d elete命令(删除当前行)。该-c "wq"是保存更改并退出。


请注意,至少在vim 8.1.2112中,它不适用于文件的最后两行重复的行。同样,它仅从3个重复行的序列中删除一个重复项。
斯特凡Chazelas

1
@StéphaneChazelas,除了我们目前在三行情况下缺少所需行为的规范-我可以同时看到两种预期行为。
D. Ben Knoble
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.