2013-07-28 374 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個。