【问题标题】:Find duplicate records in file查找文件中的重复记录
【发布时间】:2013-08-20 15:27:27
【问题描述】:

我有一个包含如下行的文本文件:

name1@domainx.com, name1
info@domainy.de, somename
name2@domainz.com, othername
name3@domainx.com, name3

如何找到重复的域,例如 domainx.comsedawk

【问题讨论】:

  • 这是 grep 的典型工作,除非您说第二个字段也可以具有该模式 (domainx.com),而您只需检查第一个字段。
  • 你真正追求的是什么?有多个域名条目的域名列表?每个域名的实际条目,其中有多个域名条目?域名列表和条目数,仅显示具有多个条目的那些?所有这些都可以有它们的用途——但它们都是不同的。这些都没有对domainx.com 具有特殊意义,除非它是列表中具有多个条目的域名类别的代表;如果它特别感兴趣,答案又是不同的。

标签: sed awk find


【解决方案1】:

只打印重复的域

awk -F"[@,]" 'a[$2]++==1 {print $2}'
domainx.com

在重复列出的行前面打印一个“*”。

awk -F"[@,]" '{a[$2]++;if (a[$2]>1) f="* ";print f$0;f=x}'
name1@domainx.com, name1
info@domainy.de, somename
name2@domainz.com, othername
* name3@domainx.com, name3

此版本将所有带有重复域的行绘制为红色

awk -F"[@,]" '{a[$2]++;b[NR]=$0;c[NR]=$2} END {for (i=1;i<=NR;i++) print ((a[c[i]]>1)?"\033[1;31m":"\033[0m") b[i] "\033[0m"}' file
name1@domainx.com, name1 <-- This line is red
info@domainy.de, somename
name2@domainz.com, othername
name3@domainx.com, name3 <-- This line is red

改进版(两次读取文件):

awk -F"[@,]" 'NR==FNR{a[$2]++;next} a[$2]>1 {$0="\033[1;31m" $0 "\033[0m"}1' file file
name1@domainx.com, name1 <-- This line is red
info@domainy.de, somename
name2@domainz.com, othername
name3@domainx.com, name3 <-- This line is red

【讨论】:

  • 我喜欢红线的解决方案!谢谢
【解决方案2】:

如果您有可用的 GNU grep,您可以使用 PCRE 匹配器进行积极的后视以提取域名。之后sortuniq 可以找到重复的实例:

<infile grep -oP '(?<=@)[^,]*' | sort | uniq -d

输出:

 domainx.com

【讨论】:

    【解决方案3】:

    使用GNU awk,您可以:

    $ awk -F'[@,]' '{a[$2]++}END{for(k in a) print a[k],k}' file
    1 domainz.com
    2 domainx.com
    1 domainy.de
    

    您可以使用sort 对输出进行排序 使用-n 升序数字:

    $ awk -F'[@,]' '{a[$2]++}END{for(k in a) print a[k],k}' file | sort -n 
    1 domainy.de
    1 domainz.com
    2 domainx.com
    

    或者只是打印重复的域:

    $ awk -F'[@,]' '{a[$2]++}END{for(k in a)if (a[k]>1) print k}' file
    domainx.com
    

    【讨论】:

    • 是的,这正是我需要的。工作正常。太好了!
    【解决方案4】:

    这里:

    sed -n '/@domainx.com/ p' yourfile.txt
    

    (实际上是grep你应该使用的那个)

    你想数一数吗?在末尾添加|nl

    使用您提供的迷你列表,使用带有|nl 的 sed 行,输出以下内容:

     1  name1@domainx.com, name1
     2  name3@domainx.com, name3
    

    如果您需要计算每个域的重复次数怎么办?试试这个:

    for line in `sed -n 's/.*@\([^,]*\).*/\1/p' yourfile.txt|sort|uniq` ; do 
        echo "$line `grep -c $line yourfile.txt`"
    done
    

    输出是:

    domainx.com 2
    domainy.de 1
    domainz.com 1
    

    【讨论】:

      猜你喜欢
      • 2013-04-27
      • 2016-12-24
      • 2019-09-24
      • 2016-07-03
      • 2014-03-18
      • 2010-10-25
      • 2015-01-15
      相关资源
      最近更新 更多