Не могу получить самое распространенное слово - PullRequest
1 голос
/ 22 марта 2020

Мне нужно взять все слова с одним гласным из файла и напечатать одно из наиболее распространенных из них. Я использую awk для сопоставления одно-гласных слов, но я не знаю, как получить наиболее распространенное.

Например, для текста test qwerty word test The result is test он должен вывести test.

Вот мой awk-скрипт:

BEGIN { IGNORECASE=1; }
{
    for(i=1; i<=NF; i++){
        pattern = "\\<[^AEYUIO]*[AEYUIO][^AEYUIO]*\\>" # pattern for one-vowel words
        if($i ~ pattern){
                print $i
        }
    }
}

Он печатает все гласные слова, теперь мне нужно получить наиболее распространенные из них. Я пытался использовать sort так: awk -f script file_with_data | sort, но я не нашел, какие параметры использовать. Помогите мне, пожалуйста.

Ответы [ 2 ]

2 голосов
/ 22 марта 2020
$ awk '
BEGIN { IGNORECASE=1; }
{
    for(i=1; i<=NF; i++){
        pattern = "\\<[^AEYUIO]*[AEYUIO][^AEYUIO]*\\>" # pattern for one-syllable words
        if($i ~ pattern){
            if(++freq[$i]>maxf){                       # keep word count and compare
                maxw=$i
                maxf=freq[$i]
            }
        }
    }
}
END{
    print maxw
}' file

Вывод:

test

Если для нескольких слов существует равное число, то выводится только одно, в этом случае, и поскольку вы уже используете GNU awk (IGNORECASE):

$ awk '
BEGIN { IGNORECASE=1; }
{
    for(i=1; i<=NF; i++){
        pattern = "\\<[^AEYUIO]*[AEYUIO][^AEYUIO]*\\>" # pattern for one-syllable words
        if($i ~ pattern)
            freq[$i]++                                 # word frequencies
    }
}
END{
    PROCINFO["sorted_in"]="@val_type_desc"             # arm for sorting order
    for(w in freq)                                     # get biggest count
        if(freq[w]>=p) {                               # and equal counts
            print w
            p=freq[w]
        } else
            break
}' file
2 голосов
/ 22 марта 2020

Вам нужно использовать awk? В противном случае вы можете получить его с сочетанием grep и uniq -c, например:

% echo test qwerty word test The result is test | tr ' ' '\n' | grep -iE "^[^AEYUIO]*[AEYUIO][^AEYUIO]*$" | sort | uniq -c | sort
1 is
1 The
1 word
3 test
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...