以下のような行を含むテキストファイルがあります。
name1@domainx.com, name1
info@domainy.de, somename
name2@domainz.com, othername
name3@domainx.com, name3
domainx.com
または のような重複ドメインを見つけるにはどうすればよいですsed
か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
改良版 (ファイルを 2 回読み取る):
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