Чтобы найти максимальное количество встречающихся букв в заданном слове

ls *.* /Dir (dir is optional) 

перечисляет каждый файл (независимо от типа файла )либо в текущем рабочем каталоге пользователя (, найденном с помощью pwd ), либо в /Dir и

ls * /Dir (dir optional)

перечисляет каждый файл и каталог на один ниже либо в текущем рабочем каталоге пользователя, либо в /Dir. Однако

ls "*" & ls *.* 

не будет рекурсивно перечисляться, для этого вам нужно

ls -R *.* /Dir

или

ls -R "*" /Dir

А почему

ls "*"

работает неправильно, вы правы:*— это подстановочный знак, и когда вы вызываете ls как таковой:

ls "*"

вы просите bash найти файл и/или каталог, в имени которого есть звездочка. Я установил IDE и не смог найти для нее файлы конфигурации и основные файлы, поэтому я использовал эти команды для поиска файлов:

(нашел файлы, соответствующие шаблону, и перенаправил их на определенный файл)

locate *eclipse* >locate_eclipse.txt
locate *tar* > locate_tar.txt
locate *.tar* > locate_".tar".txt
locate *compiler* > locate_compiler.txt
locate *JRE* > locate_JRE.txt
locate *jre* > locate_jre.txt

(Поиск по всей файловой системе и печать только тех, которые соответствуют шаблону)

ls -R / | grep "eclipse"
ls -R / | grep "tar"
ls -R / | grep ".tar"
ls -R / | grep "compiler"
ls -R / | grep "JRE"

Извините за многословие, но я постарался охватить большую часть основ.

-2
21.01.2019, 13:26
5 ответов

Попробуйте это

 Input='RaamKuumabbbb'
 output=(`echo $Input | grep -o. | sort | uniq -c | sort -nr | head -n1`)

 echo ${output[1]} appeared ${output[0]} times in the string $Input
1
28.01.2020, 05:15

Использование Perl:

$ echo 'RaamKuumabbbb' | perl -pe 'map{$c{$_}++}split(//,$_);$_=[sort{$c{$b}<=>$c{$a}}keys(%c)]->[0]'
b

(без новой строки в конце вывода)

При этом Perl используется для подсчета количества вхождений каждого символа в заданной строке, а затем сортировки полученного хэша по вхождению в порядке убывания, извлекая наиболее часто встречающийся символ.

Perl-скрипт после небольшой доработки:

# split string ($_) into individual characters
# count the number of occurrences of each in the hash %c
map { $c{$_}++ } split( //, $_ );

# sort the keys of %c (the characters) by 
# decreasing number of occurrences (the values)
# and pick out the first key
$_ = [ sort { $c{$b} <=> $c{$a} } keys(%c) ]->[0];

Параметр -pзаставит Perl вывести все, что находится в $_после выполнения кода.

Чтобы получить количество каждого символа:

$ echo 'RaamKuumabbbb' | perl -pe 'chomp;map{$c{$_}++}split(//,$_);$_=join "\n",map{"$c{$_}:$_"}sort{$c{$b}<=>$c{$a}}keys(%c)'
4:b
3:a
2:m
2:u
1:R
1:K
1
28.01.2020, 05:15

Использование только оболочки (быстрее для коротких строк):

#! /bin/bash -
input=${*:-'RaamKuumabbbb'}

tmp=$input
arr=()
maxlen=0
maxchar=''
while ((${#tmp})); do
    firstchar=${tmp:0:1}
    next=${tmp//"$firstchar"}
    len=$((${#tmp}-${#next}))
    arr+=("$firstchar: $len")
    if ((maxlen<len)); then
    maxlen=$len
    maxchar=$firstchar
    fi
    tmp=$next
done

printf '%s\n' "${arr[@]}" 
echo "The char \"$maxchar\" appear $maxlen times in \"$input\""

Вызывается как:

$./script
R: 1
a: 3
m: 2
K: 1
u: 2
b: 4
The char "b" appear 4 times in "RaamKuumabbbb"
0
28.01.2020, 05:15

если ваше слово находится в файле text.txt, вы можете использовать

  sed 's/\(.\)/\1\n/g' text.txt |  uniq -c | sort -nr  |  head -n 1

Он добавит новую строку между каждым символом, затем удалит дубликаты, отсортирует их в порядке убывания и даст вам первую запись, то есть максимальное вхождение.

Или вы можете использовать:

echo "RaamKuumabbbb" | sed -E 's/(.)/\1\n/g' |  uniq -c | sort -nr  |  head -n 1

Вышеуказанные обе команды будут давать вывод как 4 b, если вы хотите только bв качестве вывода, добавьте вывод канала в awk '{ print $2 }', т.е.:

echo "RaamKuumabbbb" | sed -E 's/(.)/\1\n/g' |  uniq -c | sort -nr  |  head -n 1 | awk '{ print $2 }'
1
28.01.2020, 05:15
echo  RaamKuumabbbb  |
perl -lpe '
  $h{$_}++ for /./g;
  ($_) = reverse map { $h{$_} > $m and ($m,$i)=($h{$_},$_);$i } keys %h;
'

Кроме того, мы можем использовать обратную числовую сортировку значений %hи получить наибольшее значение в $_:

.
perl -lpe '
  $h{$_}++ for /./g;
  ($_) = sort { $h{$b} <=> $h{$a} } keys %h;
'

Рабочий:

  • Сначала заполните хэш %h, чьи ключи — это отдельные символы во входной строке, полученные с помощью регулярного выражения /./g, а значения — количество раз, когда символ отправляется во входной строке.
  • Затем мы перебираем ключи хеша, которые являются отдельными уникальными символами в строке. На каждой итерации мы пытаемся найти максимальное количество и записать его характер.
  • Последний символ сохраняется в $_, который затем неявно переносится в stdout.
0
28.01.2020, 05:15

Теги

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