我有一个文本文件,其中包含以下行:
name1@domainx.com, name1
info@domainy.de, somename
name2@domainz.com, othername
name3@domainx.com, name3
如何使用domainx.com
或sed
找到重复的域名,例如awk
?
答案 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匹配器做一个积极的后视来提取域名。之后sort
和uniq
可以找到重复的实例:
<infile grep -oP '(?<=@)[^,]*' | sort | uniq -d
输出:
domainx.com