使用Unix工具删除连续重复行并保留非连续重复行的技术问询
用Unix工具删除连续重复行(保留非连续重复行)
这问题看起来简单但确实藏着小细节——要删的是连续重复的行,非连续的重复行得原封不动保留对吧?我给你分享几个实用的Unix工具解决方案,亲测好用:
方法1:用awk(最推荐,逻辑清晰)
awk是处理这类行对比需求的绝佳工具,一行命令就能搞定:
awk 'prev != $0 {print; prev=$0}' 你的输入文件
逻辑解释:
- 我们用
prev变量存储上一行的内容 - 每次读取当前行时,对比
prev和当前行$0:如果不一样,就打印当前行,然后把prev更新为当前行内容 - 如果两行相同,就跳过不打印,完美实现“只删连续重复”的效果
测试你的例子:
假设输入内容是:
O B O B C D T V O B
运行上面的awk命令后,输出就是你想要的:
O B C D T V O B
方法2:用sed(适合喜欢sed的场景)
如果你更习惯用sed,也可以用这个命令:
sed '$!N; /^\(.*\)\n\1$/!P; D' 你的输入文件
逻辑解释:
$!N:除了最后一行,把下一行读入模式空间(让模式空间里同时有两行内容)/^\(.*\)\n\1$/!P:如果模式空间里的两行不是完全相同的,就打印第一行D:删除模式空间里的第一行内容,然后循环处理剩下的内容
这个命令同样能达到你的需求,不过逻辑比awk稍复杂一点,适合已经熟悉sed语法的同学。
内容的提问来源于stack exchange,提问作者z.rubi
相关产品推荐
相关产品推荐

