1

それぞれがファイルを含む多くのサブディレクトリを含むディレクトリARCHIVEを検索する必要があります。各ファイルにはメールアドレスが含まれています。@ blah.comを切り捨てて、すべての電子メールアドレスをリストし、次に各名前の出現箇所をリストします。

メールを見つけて@部分を切り捨てる方法はわかりましたが、個々の名前が何回出現するかを数える方法がわかりません。

grep -R '^To: ' $ARCHIVE | cut -d@ -f1 | awk  '{print $2}' | sort | uniq

また、何らかの理由で、これをスクリプトで機能させることができません。私がそれを呼ぶときはいつでもそれは何もしません、しかし私がそれをコマンドラインに置くならばそれは働きます。

4

2 に答える 2

1

だから私たちの長いコメントの会話で私はこれをします:

grep -R '^To: ' $ARCHIVE | cut -d@ -f1 | awk  '{print $2}' | sort | uniq -c > ind.txt && wc -l ind.txt >> ind.txt

これにより、コマンドの出力が取得uniqされ、ファイルに書き込まれ、合計が収集されて同じファイルに追加され、下部に表示されます。

または、ジェフが指摘したように、あなたはそうすることができますuniq -c file.txt | awk '{print}END{print NR}'

于 2012-10-13T19:48:38.157 に答える
1

grep には count オプションがあります。

電子メールを直接照合するのに十分強力な正規表現を作成すると、1 つのコマンドですべての出現をカウントできます。

例えば

$ echo -e "1\n\2\n3\n\4" | grep [0-9] -c
4

そうは言っても、あなたがしていることはsedとawkで行うのが一番だと思います:

sed 's/@.*//' tmp/mails | sort | uniq   | \
while read name ;
do 
   echo $name; 
   awk '$1 ~ /'$name'/ { ++c; } END {print c;}' tmp/mails ;
done

cat tmp/mails:
$ cat tmp/mails 
arne@gmail.com
arnt@treemail.com
jonas@hotmail.com
arne@gmail.com
kari@yahoo.no
alex@wee.moo
arne@gmail.com
jonas@hotmail.com
kari@yahoo.no
jonas@hotmail.com
kari@yahoo.no

$  sed 's/@.*//' tmp/mails | sort | uniq   | while read name ;do echo $name; awk '$1 ~ /'$name'/ { ++c; } END {print c;}' tmp/mails ;done 
alex
1
arne
3
arnt
1
jonas
3
kari
3
于 2012-10-13T19:36:56.747 に答える