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"
Извините за многословие, но я постарался охватить большую часть основ.
Попробуйте это
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
Использование 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
Использование только оболочки (быстрее для коротких строк):
#! /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"
если ваше слово находится в файле 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 }'
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;
'
Рабочий:
/./g
, а значения — количество раз, когда символ отправляется во входной строке. stdout
.