Форум программистов, компьютерный форум, киберфорум
Shell, Bash
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
 Аватар для Johnlion
63 / 3 / 1
Регистрация: 11.05.2011
Сообщений: 666

Как вывести имена, в которых количество строчных и прописных букв одинаково?

05.12.2013, 22:51. Показов 3250. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, пожалуйста, как такой скрипт на Shell будет выглядеть "Вывести список файлов указанного каталога, в которых кол-во строчных и прописных букв одинаково"? Хотя бы как строчные и прописные буквы подсчитать?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.12.2013, 22:51
Ответы с готовыми решениями:

Как вывести имена каталогов, в которых есть каталоги?
Задание : Shell-программа выводит имена тех каталогов в каталоге, которые в себе содержат каталоги. Имя каталога задано параметром...

Дана строка. Подсчитать общее колличество прописных и строчных латинских и русских букв и вывести на консоль количество
Нужно ввести с консоли строку символов (длиной до 80 символов), и вывести на консоль количество маленьких букв в строке и количество...

Определите, каких букв (строчных или прописных ) в нем больше: если больше прописных, чем строчных=> все буквы
Определите, каких букв (строчных или прописных ) в нем больше: если больше прописных, чем строчных=> все буквы преобразуются в...

26
310 / 233 / 15
Регистрация: 01.07.2011
Сообщений: 812
Записей в блоге: 1
07.12.2013, 15:47
Цитата Сообщение от Johnlion Посмотреть сообщение
как строчные и прописные буквы подсчитать?
Элегантного решения я не знаю. Можно так попробовать, но работает не быстро:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
    low_=0
    high=0
 
    while read -s -n 1 line; do
    if expr "$line" : '[a-z]*' 2>/dev/null 1>/dev/null; then
        (( low_++ ))
    elif expr "$line" : '[A-Z]*' 2>/dev/null 1>/dev/null; then
        (( high++ ))
    fi
 
    done < $file
    echo $low_
    echo $high
В качестве $file - имя файла.
Читает посимвольно файл. Если прописные - то high++, если нижний - то low++.
1
 Аватар для Johnlion
63 / 3 / 1
Регистрация: 11.05.2011
Сообщений: 666
07.12.2013, 17:12  [ТС]
remarkes, большое спасибо А не подскажете еще, как мне пройтись по файлам заданного каталога и запоминать их имена, чтобы потом вывести список имен?
0
310 / 233 / 15
Регистрация: 01.07.2011
Сообщений: 812
Записей в блоге: 1
07.12.2013, 22:20
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
func_main() {
    func_check_ls /projects
}
 
 
#~ читает указанный каталог
func_check_ls() {
    local IFS=$'\n'
 
    files=( $(ls "$1" -R) )
    if [ -f "$files" ]; then
        func_read_file "$files"
    fi
}
 
 
func_read_file() {
    low_=0
    high=0
 
    while read -s -n 1 line; do
        if   expr "$line" : '[a-z]*' 2>/dev/null 1>/dev/null; then
            (( low_++ ))
        elif expr "$line" : '[A-Z]*' 2>/dev/null 1>/dev/null; then
            (( high++ ))
        fi
    done < "$1"
    echo $low_
    echo $high
}
 
 
func_main
exit 0
Добавлено через 5 минут
а может имелось ввиду
Цитата Сообщение от Johnlion Посмотреть сообщение
кол-во строчных и прописных букв одинаково
в именах файлов?
1
 Аватар для Johnlion
63 / 3 / 1
Регистрация: 11.05.2011
Сообщений: 666
08.12.2013, 00:08  [ТС]
remarkes, не, имелось в виду, внутри файлов, а потом те, в которых одинаково - вывести их имена

Добавлено через 6 минут
remarkes, а вот как имена вывести? где-то зациклить echo или как?
0
310 / 233 / 15
Регистрация: 01.07.2011
Сообщений: 812
Записей в блоге: 1
08.12.2013, 11:21
Johnlion, в функции чеклс - это массив files
1
 Аватар для Johnlion
63 / 3 / 1
Регистрация: 11.05.2011
Сообщений: 666
08.12.2013, 13:27  [ТС]
remarkes, а где мне вставить
Bash
1
echo $files
?
0
310 / 233 / 15
Регистрация: 01.07.2011
Сообщений: 812
Записей в блоге: 1
08.12.2013, 16:06
Цитата Сообщение от Johnlion Посмотреть сообщение
remarkes, а где мне вставить
Видимо ты не понимаешь суть кода. $files - это просто массив со всеми найденными файлами (в т.ч. каталогами, ссылками и т.п.)
На - дивись. Тебе это в институте задали?
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#!/bin/bash
#~ Вывести список файлов указанного каталога, в которых кол-во строчных и прописных букв одинаково
 
 
declare -a FI_AR    #~ массив с найденными файлами
declare -a HI_AR    #~ количество прописных в найденных файлах
declare -a LO_AR    #~ количество строчных в найденных файлах
declare -a F_RES    #~ имена совпавших файлов
declare -i CNT=0    #~ счетчик массивов
 
 
func_main() {   #~ главная функция
    echo -ne "" >/tmp/find_chars.log    #~ обнуляем лог
    func_check_ls /каталог для проверки
    echo ---
    func_make_arrs
    echo ---
    func_show_arrs
    echo ---
    func_compare_files
}
 
 
func_check_ls() {   #~ читает указанный каталог
    local IFS=$'\n'
 
    files=( $(ls -R "$1") ) #~ читает рекурсивно каталог в массив
    for (( i = 0; i < ${#files[@]}; i++ )); do
        files[$i]="$1/${files[$i]}"
        #~ если файл, то считает буквы
        [ -f "${files[$i]}" ] || continue
        [ -r "${files[$i]}" ] || continue
        readelf -h "${files[$i]}" 1>/dev/null 2>/dev/null
        #~ если не ельф файл (бинарник) то возвращает 1
        (( $? == 1 )) || continue
        FI_AR[$CNT]="${files[$i]}"
        echo -ne "CNT="$CNT"; "
        func_read_file ${FI_AR[$CNT]} $CNT &
        (( CNT++ ))
    done
    wait
}
 
 
func_read_file() {  #~ считает буквы в файле. $1 - имя файла, $2 - индекс CNT
    local low_=0    #~ счетчик строчных
    local high=0    #~ счетчик прописных
    local line
 
    while read -s -n 1 line; do
        if   expr "$line" : '[a-z]*' 2>/dev/null 1>/dev/null; then
            (( low_++ ))
        elif expr "$line" : '[A-Z]*' 2>/dev/null 1>/dev/null; then
            (( high++ ))
        fi
    done < "$1"
    echo -e "$1|$high|$low_" >> /tmp/find_chars.log
}
 
 
func_make_arrs() {  #~ создаем массивы
    local i=0
    local line
 
    while read line; do
        FI_AR[$i]=$( echo "$line" | awk -F '|' '{print $1}' )   #~ после -F стоит разделитель
        LO_AR[$i]=$( echo "$line" | awk -F '|' '{print $2}' )   #~ после -F стоит разделитель
        HI_AR[$i]=$( echo "$line" | awk -F '|' '{print $3}' )   #~ после -F стоит разделитель
        (( i++ ))
    done < /tmp/find_chars.log
    (( CNT = i ))
}
 
 
func_show_arrs() {  #~ выводит полученные массивы
    local i
 
    for (( i = 0; i < CNT; i++ )); do
        echo "$(basename "${FI_AR[$i]}"):${LO_AR[$i]}:${HI_AR[$i]}"
    done
}
 
 
func_compare_files() {  #~ 
    for (( h = 0; h < (CNT - 1); h++ )); do
        [ "${HI_AR[$h]}" != "" ] || continue
        for (( l = h + 1; l < CNT; l++ )); do
            (( HI_AR[h] == HI_AR[l] )) && \
            (( LO_AR[h] == LO_AR[l] )) && \
            F_RES="$F_RES\n$( basename "${FI_AR[$h]}" ) | $( basename "${FI_AR[$l]}" )" && \
            unset FI_AR[$l] && \
            unset HI_AR[$l] && \
            unset LO_AR[$l] && \
            true
        done
    done
    echo -e "$F_RES"
}
 
 
func_main
exit 0
Добавлено через 5 минут
лог файл я создаю потому, что я вызываю func_read_file в фоне (амперсанд в конце). Это для скорости - чтобы файлы сканировались параллельно.
/каталог для проверки - это каталог, который ты будешь вызывать. оберни его в кавычки.
1
 Аватар для Johnlion
63 / 3 / 1
Регистрация: 11.05.2011
Сообщений: 666
13.12.2013, 20:51  [ТС]
Здравствуйте Вот написал код на Shell. Он должен подсчитывать количество строчных и прописных букв в файлах заданного каталога и выводить имена файлов, в которых кол-во строч. и проп. букв равны. Но оно выводит просто адреса всех файлов, лежащих в каталоге вот так:

Code
1
2
3
4
5
/home/ubuntu/Folder/File1
/home/ubuntu/Folder/File1~
...
/home/ubuntu/Folder/File4
/home/ubuntu/Folder/File~
Что за ~ не понятно и почему оно выводит эти адреса тоже не понятно. Не подскажете, что не так?
Bash
1
2
3
4
5
6
7
8
9
10
echo -n "Укажите путь к каталогу: "
    read pathDir
    find $pathDir -type f|while read FILE; do   
    Big_Chars=$(grep -o -c [A-Z] "$FILE")
    Small_Chars=$(grep -o -c [a-z] "$FILE") 
    if [ $Big_Chars -eq $Small_Chars ]; then
        echo "$FILE"    
    fi
    done 
       ;;
0
310 / 233 / 15
Регистрация: 01.07.2011
Сообщений: 812
Записей в блоге: 1
13.12.2013, 21:34
Johnlion, так я уже тебе написал код. Чего надо-то?
1
 Аватар для Johnlion
63 / 3 / 1
Регистрация: 11.05.2011
Сообщений: 666
13.12.2013, 21:46  [ТС]
remarkes, мне он не очень понятен, а мой код хоть сам написал и проше разобраться. может подскажете, как его модифицировать?
0
310 / 233 / 15
Регистрация: 01.07.2011
Сообщений: 812
Записей в блоге: 1
13.12.2013, 22:59
Johnlion, посмотрю

Добавлено через 27 минут
Johnlion, хм...
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
 
echo -n "Укажите путь к каталогу: "
read pathDir
#~ pathDir=prb_find_chars
find $pathDir -type f | while read FILE; do   
    Big_Chars=$(grep -o -c [A-Z] "$FILE")
    Small_Chars=$(grep -o -c [a-z] "$FILE")
        if [ $Big_Chars -eq $Small_Chars ]; then
            echo "$FILE"
        fi
done
exit 0
в таком виде все работает...
Передай привет своему преподавателю, что неплохо бы научиться правильно составлять ТЗ: "Вывести список файлов указанного каталога, в которых кол-во строчных и прописных букв одинаково".
Мой код выводит файлы, у которых количество строчных и прописных одинаково между найденными файлами.
1
 Аватар для Johnlion
63 / 3 / 1
Регистрация: 11.05.2011
Сообщений: 666
13.12.2013, 23:34  [ТС]
remarkes, не пойму. Вы не меняли мой код и работает? Может дело в том, что я с диска запускаю Ubuntu, а не установленную?
0
 Аватар для Johnlion
63 / 3 / 1
Регистрация: 11.05.2011
Сообщений: 666
14.12.2013, 16:40  [ТС]
remarkes, посмотрите, пожалуйста. Вот такое выводит, а должно выводить File1 и Filee2. Ubuntu установил себе на хард, не помогло

Содержимое папки Folder ниже.
Миниатюры
Как вывести имена, в которых количество строчных и прописных букв одинаково?  
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
14.12.2013, 20:10
Цитата Сообщение от Johnlion Посмотреть сообщение
Что за ~ не понятно
это когда файл редактируешь, редактор сохраняет предыдущую версию под таким именем
1
 Аватар для Johnlion
63 / 3 / 1
Регистрация: 11.05.2011
Сообщений: 666
14.12.2013, 20:11  [ТС]
accept, понятно. А как быть с моим заданием? Почему оно не то, что надо выводит?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
14.12.2013, 20:16
Цитата Сообщение от Johnlion Посмотреть сообщение
remarkes, не, имелось в виду, внутри файлов, а потом те, в которых одинаково - вывести их имена
откуда ты знаешь, что внутри надо буквы искать ?
может, в именах ?
0
 Аватар для Johnlion
63 / 3 / 1
Регистрация: 11.05.2011
Сообщений: 666
14.12.2013, 20:58  [ТС]
accept, нет, внутри файлов. И если внутри файла количество прописных и строчных букв равно, то запоминаем его имя и потом выводим
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
14.12.2013, 22:34
Bash
1
2
3
4
5
6
7
8
9
count()
{
    case $1 in
      l) s='[:lower:]';;
      u) s='[:upper:]';;
      *) return 1;;
    esac
    cat "$2" | tr -cd "$s" | wc -c
}
Code
1
2
3
4
5
6
7
8
[guest@localhost sh]$ cat file_no.txt 
aaAA
BbB
[guest@localhost sh]$ count l file_no.txt
3
[guest@localhost sh]$ count u file_no.txt
4
[guest@localhost sh]$
Добавлено через 7 минут
Цитата Сообщение от remarkes Посмотреть сообщение
в таком виде все работает
не, там неправильный способ подсчёта

Цитата Сообщение от Johnlion Посмотреть сообщение
может подскажете, как его модифицировать?
вставишь функцию наверх, а потом вызовы вставишь с помощью $()
1
 Аватар для Johnlion
63 / 3 / 1
Регистрация: 11.05.2011
Сообщений: 666
14.12.2013, 23:25  [ТС]
accept, не совсем понимаю как на shell вызывать функции, посмотрите, пожалуйста, окончательный вариант будет таким?
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
count()
{
    case $1 in
      l) s='[:lower:]';;
      u) s='[:upper:]';;
      *) return 1;;
    esac
    cat "$2" | tr -cd "$s" | wc -c
}
 
echo -n "Укажите путь к каталогу: "
    read pathDir
    find $pathDir -type f|while read FILE; do   
    Big_Chars="$(count u "$FILE")"
    Small_Chars="$(count l "$FILE")"
    if [ $Big_Chars -eq $Small_Chars ]; then
        echo "$FILE"    
    fi
    done 
       ;;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.12.2013, 23:25
Помогаю со студенческими работами здесь

Подсчитать количество содержащихся в ней цифр, прописных букв и строчных букв.
Дана строка. Подсчитать количество содержащихся в ней цифр, прописных букв и строчных букв.

Заполнить и вывести на экран массив из всех латинских букв, как прописных, так и строчных.
1)Заполнить и вывести на экран массив из всех латинских букв, как прописных, так и строчных.

Заполнить и вывести на экран массив из всех латинских букв, как прописных, так и строчных
1)Заполнить и вывести на экран массив из всех латинских букв, как прописных, так и строчных. 2)Заполнить и вывести массив из латинских...

Дана строка. Подсчитать количество содержащихся в*ней цифр, прописных букв и строчных букв (на С)
Помогите решить задачу. Есть вот такой код, но он считает только строчные буквы. #include &lt;stdio.h&gt; #include...

Дана строка. Подсчитать количество содержащихся в ней цифр, прописных букв и строчных букв
Дана строка. Подсчитать количество содержащихся в ней цифр, прописных букв и строчных букв.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru