2

我正在尝试删除匹配模式,从第二次出现开始,使用sedor awk。输入文件包含以下信息:

abc
def
abc
ghi
jkl
abc
xyz
abc

我想abc从第二个实例中删除模式。输出应如下所示:

abc
def
ghi
jkl
xyz
4

4 回答 4

6

整洁的sed解决方案:

sed '/abc/{2,$d}' test.txt
abc
def
ghi
jkl
xyz
于 2013-07-28T17:39:26.257 回答
3
$ awk '$0=="abc"{c[$0]++} c[$0]<2; ' file
abc
def
ghi
jkl
xyz

只需将“2”更改为“3”或您想要保留前 N 次出现的任何数字,而不仅仅是前 1 次。

于 2013-07-28T23:26:33.250 回答
2

一种使用方式awk

$ awk 'f&&$0==p{next}$0==p{f=1}1' p="abc" file
abc
def
ghi
jkl
xyz

只需设置p为只需要第一个打印实例的模式:

于 2013-07-28T17:22:45.507 回答
1

取自:unix.com

使用awk '!x[$0]++'将删除重复的行。x是一个数组,它被初始化为0。x的索引是$0,如果$0是第一次遇到,那么x[$0]的值加1,x[$0]现在是1。因为++这里是"后缀 ++",0 返回然后添加。所以 !x[$0] 为真,默认打印 $0。如果 $0 出现多次,!x[$0] 将为假,因此不会打印 $0。

于 2013-07-28T17:20:17.853 回答