Найти в тексте все слова, которые встречаются 10 или более раз

Возможно, вы имеете в виду что-то подобное?

#!/bin/bash
for (( c=0; c<=200; c++ ))
do
    output=$(php ./script.php "$1")
    case $output in
      *'foo'*) echo "Loop terminated"; break;; 
    esac
    echo "$output"
done

Вдохновленный ответом @Archemar , вы также можете сказать

#!/bin/bash
for (( c=0; c<=200; c++ ))
do
    ! php ./script.php "$1" | grep -v 'foo' || break
done

0
29.11.2016, 18:49
3 ответа
< text tr -cs '[:alnum:]' '[\n*]' |
  awk '++count[$0] == 10' |
  sort

Замените $ 0 на tolower ($ 0) , если вы хотите игнорировать регистр.

То, что tr соответствует s эквивалентам символов, которые являются c дополнением al pha num эрические к n ewlines. awk печатает 10-е вхождение каждого.

Обратите внимание, что в системах GNU, tr не работает должным образом с многобайтовыми символами . Однако в этих системах вы можете вместо этого использовать расширение GNU grep -o :

< text grep -Eo '[[:alnum:]]+' |
  awk '++count[$0] == 10' |
  sort

Вы можете изменить это значение на

< text grep -Eo '[^[:punct:][:space:]]+' |
  awk '++count[$0] == 10' |
  sort

, чтобы рассматривать символы, которые не являются ни punct uation или space (или tr -s '[: punct:] [: space:]' '[\ n *]' выше для систем, отличных от GNU, или текст в формате ASCII), который в тексте «Война и мир» дает тот же результат.

Обратите внимание, что, по крайней мере, в системах GNU, это может по-прежнему давать неправильные результаты, поскольку, например, комбинированные акценты Unicode классифицируются как пунктуация , а не alnums (они не появляются в этом текст, где акцентированные символы находятся в их комбинированной форме).

3
28.01.2020, 02:16

В perl :

perl -e 'while(<>){while(/([[:alpha:]]+)/g){$c{$&}++}};foreach $w(keys %c){if($c{$w}<10){delete $c{$w}}};foreach $w(sort keys %c){print "$w\n"}' WarAndPeace.txt

С отступом :

perl -e '# Let s count every words
         while(<>){
             while(/([[:alpha:]]+)/g){
                 $c{$&}++
             }
          }
          # Let s remove lesser than 10
          foreach $w(keys %c){
              if($c{$w}<10){
                  delete $c{$w}
              }
          }
          # Let s sort and print
          foreach $w(sort keys %c){
              print "$w\n"
          }' WarAndPeace.txt

С UTF-8 :

 perl -e 'use open qw/:std :utf8/;
          # Let s count every words
             while(<>){
                 while(/([[:alpha:]]+)/g){
                     $c{$&}++
                 }
              }
              # Let s remove lesser than 10
              foreach $w(keys %c){
                  if($c{$w}<10){
                      delete $c{$w}
                  }
              }
              # Let s sort and print
              foreach $w(sort keys %c){
                  print "$w\n"
              }' WarAndPeace.txt
1
28.01.2020, 02:16

Если вы уже удалили из файла точки и пробелы и в нем есть только слова, как указано в ваших комментариях (без лишних пробелов / табуляций), вы можете использовать sort , uniq и awk , чтобы получить то, что вы хотели:

sort file_with_words | uniq -c | awk '{ if ($1 >= 10) { print}}'

Мое решение работает только в том случае, если файл правильно отформатирован (одно слово / строка, без лишних пробелов / табуляции).

1
28.01.2020, 02:16

Теги

Похожие вопросы