【问题标题】:Remove duplicate line only contain specific string删除重复行仅包含特定字符串
【发布时间】:2016-01-05 21:42:01
【问题描述】:

我仅在包含特定字符串时才尝试删除重复行。 只删除重复的行很容易,但是删除一些有用的行:

awk '!seen[$0]++'

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

示例:

保留包含“host_name=”的行的第一次出现
保留所有出现的包含 "plugin output="
的行 上面的awkPerl 命令也删除了客户号。

我的输出命令:

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/sed/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

【问题讨论】:

    标签: regex bash perl awk sed


    【解决方案1】:

    你可以使用这个 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= 开头或者是唯一的,则打印记录。

    【讨论】:

      【解决方案2】:

      您正在使用的 sn-p 正在做的事情与您正在尝试做的事情略有不同。

      为了完成你想要的 - 你将不得不解析当前行。

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

      应该是诀窍

      【讨论】:

        【解决方案3】:

        Perl 版本:

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

        或者如果你仍然想使用unless(我发现if在这种情况下更具可读性):

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

        【讨论】:

          猜你喜欢
          • 2020-02-04
          • 2020-09-27
          • 1970-01-01
          • 2016-07-16
          • 2021-03-17
          • 2012-03-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多