如果下一行相同则删除该行

如果下一行相同则删除该行

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

输入:

abc
abc
def
abc
abc
def

预期输出:

abc
def
abc
def

答案1

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

uniq your-file

请注意,某些uniq实现(例如 GNU)uniq将为您提供一系列行中的第一行排序相同(其中strcoll()返回 0)而不是字节与字节相同(其中memcmp()orstrcmp()返回 0)。要强制进行字节到字节的比较(无论uniq实现如何),您可以强制使用以下语言环境C

LC_ALL=C uniq your-file

答案2

Vim 可以很好地实现这一点:

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

或者,如果您更愿意使用 vim 作为命令行工具,您可以这样做

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

这样你以后就不必费力退出 vim ;)

解释:

:g/

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

\v^(.*\n)\1

任何一行后面都有其自身...

/d

跑过delete 命令(删除当前行)。就是-c "wq"保存修改并退出。

答案3

这是一个awk等价的:

awk 'p!=$0; {p=$0}' file

p!=$0;如果与前一行不同,则;此处需要打印行。 {p=$0}设置p为当前行。

如果第一行为空,则一个明显的错误是缺少第一行。一个简单的修复方法是:

awk 'NR==1 || p!=$0; {p=$0}' file

相关内容