在文件中查找重复记录

时间:2013-08-18 20:50:56

标签: sed awk find

我有一个文本文件,其中包含以下行:

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

如何使用domainx.comsed找到重复的域名,例如awk

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

下面:

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

(实际上grep你应该使用什么)

你愿意数数吗?在最后添加|nl

使用你使用|nl的sed行给出的那个minilist输出:

 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

答案 2 :(得分: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

答案 3 :(得分:0)

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

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

输出:

 domainx.com