我有一个带有如下行的文本文件:
name1@domainx.com, name1
info@domainy.de, somename
name2@domainz.com, othername
name3@domainx.com, name3
我怎样才能找到重复的域,如domainx.com
with sed
or awk
?
与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
这里:
sed -n '/@domainx.com/ p' yourfile.txt
(实际上是grep
你应该使用的)
你想数一数吗?在末尾添加一个|nl
。
使用您提供的那个迷你列表,使用带有 sed 的行|nl
,输出以下内容:
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
仅打印重复的域
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
如果您有可用的 GNU grep,则可以使用 PCRE 匹配器进行积极的后视以提取域名。之后,sort
可以uniq
找到重复的实例:
<infile grep -oP '(?<=@)[^,]*' | sort | uniq -d
输出:
domainx.com