2013-07-28 173 views
2

我试图使用sedawk删除匹配模式,从第二次出现开始。输入文件包含以下信息:我想从第二个实例中删除模式abc如何从给定匹配项中删除匹配模式

abc 
def 
abc 
ghi 
jkl 
abc 
xyz 
abc 

。输出应该如下:

abc 
def 
ghi 
jkl 
xyz 

回答

6

整洁sed解决方案:

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

如果第一个'abc'模式发生在第二行或更后,这将不起作用。这个命令只是忽略第一行,从第二行解析到最后一行:'2,$'。 –

1

来自unix.com

使用awk '!x[$0]++'将消除重复行。 x是一个数组,它被初始化为0.x的索引是$ 0,如果$ 0是第一次见面,那么加1到x [$ 0]的值,现在x [$ 0]是1.As ++这里是“后缀++“,返回0,然后加入.So!x [$ 0]为真,默认情况下打印$ 0。如果$ 0出现多次,! x [$ 0]将为false,因此不会打印$ 0。使用awk

+0

这也将删除任何其他模式的重复。我认为OP只是希望删除给定模式的副本。 –

2

方式一:

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

只需设置p图案,您只需要打印的第一个实例:

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

刚将“2”更改为“3”或任何数字你w蚂蚁保持前N个事件而不是前1个。