2015-10-08 137 views
1

我嘗試刪除重複行只有包含特定字符串。 可以很容易地僅除去複製線,但有些有用行與刪除:刪除重複行僅包含特定字符串

awk '!seen[$0]++' 

perl -ne 'print unless $seen{$_}++' 

例:

保持含有線的第一次出現的 「HOST_NAME =」
保留所有出現的包含「插件輸出=」
以上的行awkPerl命令tha t也刪除客戶號碼。

我的輸出命令:

host_name=Client1 
plugin_output=Name : Client1 Marseille 
host_name=Client1 
plugin_output=Client : 168131 
host_name=Client1 
host_name=Client1 
host_name=Client1 
host_name=Client1 
host_name=Client1 
host_name=Client1 
host_name=Client1 
host_name=Client2 
plugin_output=Name : Client2 Besançon 
host_name=Client2 
plugin_output=Client : 168131 
host_name=Client2 
host_name=Client2 
host_name=Client2 
host_name=Client2 
host_name=Client2 
host_name=Client2 
host_name=Client2 
host_name=Client2 
host_name=Client3 
plugin_output=Name : Client3 BRETAGNE 
host_name=Client3 
plugin_output=Client : 168131 
host_name=Client3 
host_name=Client3 
host_name=Client3 
host_name=Client3 
host_name=Client3 
host_name=Client3 
host_name=Client3 
host_name=Client4 
plugin_output=Name : Client4 
host_name=Client4 
plugin_output=Client : 168131 
host_name=Client4 
host_name=Client4 
host_name=Client4 
host_name=Client4 
host_name=Client4 
host_name=Client4 
host_name=Client4 
host_name=Client5 
plugin_output=Name : Client5 
host_name=Client5 
plugin_output=Client : 168131 
host_name=Client5 
host_name=Client5 
host_name=Client5 
host_name=Client5 
host_name=Client5 
host_name=Client5 
host_name=Client5 
host_name=Client6 
plugin_output=Name : Client6 
host_name=Client6 
plugin_output=Client : 168131 
host_name=Client6 
host_name=Client6 
host_name=Client6 
host_name=Client6 
host_name=Client6 
host_name=Client6 
host_name=Client6 
host_name=Client6 
host_name=Client7 
plugin_output=Name : Client7 
host_name=Client7 
plugin_output=Client : 168131 
host_name=Client7 
host_name=Client7 
host_name=Client7 
host_name=Client7 
host_name=Client7 
host_name=Client7 
host_name=Client7 
host_name=Client7 
host_name=Client8 
plugin_output=Name : Client8 
host_name=Client8 
plugin_output=Client : 168131 
host_name=Client8 
host_name=Client8 
host_name=Client8 
host_name=Client8 
host_name=Client8 
host_name=Client8 
host_name=Client8 
後的awk /桑達/ perl的/ ...

目標值:

host_name=Client1 
plugin_output=Name : Client1 Marseille 
plugin_output=Client : 168131 
host_name=Client2 
plugin_output=Name : Client2 Besançon 
plugin_output=Client : 168131 
host_name=Client3 
plugin_output=Name : Client3 BRETAGNE 
plugin_output=Client : 168131 
host_name=Client4 
plugin_output=Name : Client4 
plugin_output=Client : 168131 
host_name=Client5 
plugin_output=Name : Client5 
plugin_output=Client : 168131 
host_name=Client6 
plugin_output=Name : Client6 
plugin_output=Client : 168131 
host_name=Client7 
plugin_output=Name : Client7 
plugin_output=Client : 168131 
host_name=Client8 
plugin_output=Name : Client8 
plugin_output=Client : 168131 

回答

2

您可以使用此AWK:

awk '/^plugin_output=/ || !seen[$0]++' file 
host_name=Client1 
plugin_output=Name : Client1 Marseille 
plugin_output=Client : 168131 
host_name=Client2 
plugin_output=Name : Client2 Besançon 
plugin_output=Client : 168131 
host_name=Client3 
plugin_output=Name : Client3 BRETAGNE 
plugin_output=Client : 168131 
host_name=Client4 
plugin_output=Name : Client4 
plugin_output=Client : 168131 
host_name=Client5 
plugin_output=Name : Client5 
plugin_output=Client : 168131 
host_name=Client6 
plugin_output=Name : Client6 
plugin_output=Client : 168131 
host_name=Client7 
plugin_output=Name : Client7 
plugin_output=Client : 168131 
host_name=Client8 
plugin_output=Name : Client8 
plugin_output=Client : 168131 

它打印如果它以plugin_output=開頭或者它是唯一的記錄。

+1

耶! 確切需要什麼!謝謝 – Overcrash

0

您正在使用的代碼段正在做的事情與您嘗試做的事情略有不同。

爲了完成你想要的 - 你將不得不解析當前行。

perl -pe 'if (my ($host) = m/host_name=(\w+)/) { next if $seen{$host}++; }' 

如若招

+0

你的提示不起作用,但我會用awk方法。 thx – Overcrash

0

Perl版本:

perl -ne 'print if !$seen{$_}++ || /^plugin_output=/' 

,或者如果你仍然想使用unless(我發現if在這種情況下更易讀):

perl -ne 'print unless $seen{$_}++ && !/^plugin_output=/' 
+0

工作很好,但比awk :) thx稍長 – Overcrash