如何从给定的出现中删除匹配模式

时间:2013-07-28 17:14:47

标签: linux bash unix sed awk

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

abc
def
abc
ghi
jkl
abc
xyz
abc

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

abc
def
ghi
jkl
xyz

4 个答案:

答案 0 :(得分:6)

整洁的sed解决方案:

sed '/abc/{2,$d}' test.txt
abc
def
ghi
jkl
xyz

答案 1 :(得分:3)

$ awk '$0=="abc"{c[$0]++} c[$0]<2; ' file
abc
def
ghi
jkl
xyz

只需更改&#34; 2&#34;到&#34; 3&#34;或者你想要保留前N次出现的任何数字,而不仅仅是第一次出现。

答案 2 :(得分:2)

使用awk的一种方式:

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

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

答案 3 :(得分:1)

取自:unix.com

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