2014-04-02 2 views
2

У меня есть файл, как:Как считать возникновение определенных символов в файле с помощью команды AWK, используя ассоциативный массив

[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 

И я хочу считать появление каждого домена в

Domain Name No of Email 
----------------------- 
com   1 
in   3 
uk   1 
+0

Есть ли у этих лиц одобрите ваше размещение своих адресов здесь, в ясном виде? – tripleee

+0

@tripleee: Хотя они _look_, как настоящие адреса электронной почты, похоже, что они не являются (по крайней мере, согласно http://verify-email.org/). – mklement0

+0

Я бы не стал доверять этому инструменту. Все это показывает, что они отключили эту распространенную технику спамера на своих серверах. – tripleee

ответ

2

Вы можете использовать sed, sort, uniq:

sed 's/.*[.]//' input | sort | uniq -c 

дает:

1 com 
    3 in 
    1 uk 

и некоторые макияж с awk:

sed 's/.*[.]//' input | sort | uniq -c | \ 
    awk 'BEGIN{print "Domain Name No of Email\n-----------------------"} \ 
      {print $2"\t\t"$1}' 

Чтобы получить:

Domain Name No of Email 
----------------------- 
com  1 
in  3 
uk  1 
+0

Я изначально прокомментировал «+1 для элегантной комбинации нескольких инструментов», но комментарий исчез; в случае, если он был удален специально: я хотел бы отметить, что этот ответ в духе Unix сочетается с небольшими специализированными утилитами для достижения более крупной задачи и, как таковая, является интересной альтернативой монолитному решению 'awk' в моем собственном ответе. – mklement0

3

Вот чисто POSIX awk решение (с sort вызывается из внутри awk prog баран):

awk -F. -v OFS='\t' ' 
    # Build an associative array that maps each unique top-level domain 
    # (taken from the last `.`-separated field, `$NF`) to how often it 
    # occurs in the input. 
    { a[$NF]++ } 

    END { 
     # Print the header. 
    print "Domain Name", "No of Email" 
    print "----------------------------" 
    # Output the associative array and sort it (by top-level domain). 
    for (k in a) print k, a[k] | "sort" 
    } 
' file 

Если у вас есть GNU awk 4.0 или выше, вы можете обойтись без внешнего sort и даже легко контролировать поле сортировки внутри программы gawk:

gawk -F. -v OFS='\t' ' 
    # Build an associative array that maps each unique top-level domain 
    # (taken from the last `.`-separated field, `$NF`) to how often it 
    # occurs in the input. 
    { a[$NF]++ } 

    END { 
     # Print the header. 
    print "Domain Name", "No of Email" 
    print "----------------------------" 
    # Output the associative array and sort it (by top-level domain). 
    # First, control output sorting by setting the order in which 
    # the associative array will be looped over by, via the special 
    # PROCINFO["sorted_in"] variable; e.g.: 
    # - Sort by top-level domain, ascending: "@ind_str_asc" 
    # - Sort by occurrence count, descending: "@val_num_desc" 
    PROCINFO["sorted_in"]="@ind_str_asc" 
    for (k in a) print k, a[k] 
    } 
' file 
Смежные вопросы