2015-10-08 180 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