Форум программистов, компьютерный форум, киберфорум
Shell, Bash
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 10.11.2021
Сообщений: 5

Скрипт для поиска/подсчёта значений в текстовом файле

05.10.2022, 22:18. Показов 740. Ответов 7

Студворк — интернет-сервис помощи студентам
Говоря простым языком, есть файл с числами такого вида:
0 0 0
1 2 3
4 5 6
7 8 9
10 11 12
т.е. что-то вроде таблицы. Нужно, чтобы пользователь выбирал знак (>, <, =) и вводил число, по которому будет производиться поиск. Если это знаки > или <, то нужно выводить сами найденные значения, а если равно, то количество таких чисел в файле. Вот, что я написал
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
echo "Enter operation (>, <, =): "
read op
echo "Enter number: "
read num
printf "You search for numbers %s%d" "$op" "$num"
if [ "$op" = "=" ]
     then
     awk '$3 = $num or $2 = $num or $1 = $num{counter++}' table.txt # Что-то вроде такого...?
     printf "There are %d numbers equal %d" "$counter" "$num"
fi
 
if [ "$op" = ">" ]
     then 
     ###
fi
 
if [ "$op" = "<" ]
     then
     ###
fi
Не понимаю, как реализовать поиск, и нужно ли его вообще реализовывать с помощью awk. Может есть какое-то простое решение?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.10.2022, 22:18
Ответы с готовыми решениями:

Скрипт для поиска слов или символов в текстовом файле
Помогите разобраться, почему не работает On Error Resume Next Dim fso, str, i, lis Set FSO =...

Алгоритм поиска значений в текстовом файле
Добрый вечер, уважаемые участники форума. Прошу помощи с нелегким для меня заданием, а точнее построением алгоритма. Есть...

C++ программа для подсчета букв в текстовом файле
Помогите, не могу закончить программу она должна подсчитывать буквы текстовом файле, но она подсчитывает все (пробел,переход, комы и т. д.)...

7
322 / 47 / 11
Регистрация: 08.04.2022
Сообщений: 187
06.10.2022, 00:23
Лучший ответ Сообщение было отмечено Folder_N как решение

Решение

Сразу несколько вопросов:
1. Например, ввел ">" и "5". 7, 8 и 9 во второй снизу строке считать как +3 (то есть 3 числа) или +1 (то есть строка, содержащая хотя бы одно число большее 5)?
2. Табличное разбиение по строкам и столбцам - принципально? Может ли оказатся так, что количество столбцов может отличаться от 3 и быть разным в пределах одного файла?

Добавлено через 1 час 8 минут
Несколько вариантов исполнения.

1. Классическое, лобовое решение
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
op="<"
num=6
 
data() {
    printf '%s %s %s\n' 0 0 0 {1..12}
}
 
data \
| awk -v op="$op" -v num="$num" '
{
    for (i = 1; i <= NF; i++) {
        if ( $i < num && op == "<" || $i > num && op == ">" ) {
            print $i
        } else if ( $i == num && op == "=" ) {
            eq++
        }
    }
}
END { if ( op == "=" ) { print eq } }
'
2. Вариант с "линеаризацией" таблицы и последующей обработкой
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
op="<"
num=6
 
data() {
    printf '%s %s %s\n' 0 0 0 {1..12}
}
 
data \
| tr [:space:] \\n \
| awk -v op="$op" -v num="$num" '
$0 < num && op == "<" || $0 > num && op == ">" { print }
op == "=" && $0 == num { eq++ }
END { if ( op == "=" ) { print eq } }
'
3. С генерацией awk-кода в шелл-скрипте с "линеаризацией" как в варианте 2
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
op="<"
num=6
 
if [ "$op" = "=" ]
then
    AWK="\$0 == $num { eq++ } END { print eq }"
else
    AWK="\$0 $op $num { print }"
fi
 
data() {
    printf '%s %s %s\n' 0 0 0 {1..12}
}
 
data \
| tr [:space:] \\n \
| awk "$AWK"
1
0 / 0 / 0
Регистрация: 10.11.2021
Сообщений: 5
06.10.2022, 00:56  [ТС]
Большое спасибо, не ожидал столь быстрого ответа. Как я вижу, вы всё верно поняли и так.
Единственное что заменил, это data на cat имя файла.
0
Эксперт NIX
 Аватар для nezabudka
3334 / 752 / 252
Регистрация: 28.06.2015
Сообщений: 1,552
Записей в блоге: 16
06.10.2022, 07:59
Цитата Сообщение от Folder_N Посмотреть сообщение
echo "Enter operation (>, <, =): "
read op
echo "Enter number: "
read num
Почему бы не вводить одной строкой?

siberian-man, Мне кажется здесь можно пойти на хитрость;
Bash
1
2
3
4
5
6
7
8
read -p 'Enter operation [< > =] and number in one line: ' op num 
case $op in
        \<|\>)  awk "\$0 $op $num" RS='[[:space:]]+' file
                ;;
        =)      awk "$num $op= "'$0 {j++} END {print j}' RS='[[:space:]]+' file
                ;;
        *)      echo ERROR
esac
Добавлено через 34 минуты
Еще вариант с выбором оператора в цикле:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
arr='< > = quit'
PS3='Enter operation: '
 
select op in $arr; do
        case $REPLY in
                4) echo Good bye
                        break
                        ;;
                1|2|3) read -p 'Enter number: ' num 
                        ;;&
                1|2)
                        awk "\$0 $op $num" RS='[[:space:]]+' file
                        ;;
                3)      awk "$num $op= "'$0 {j++} END {print j}' RS='[[:space:]]+' file
                        ;;
                *)      echo ERROR try again
        esac
done
0
322 / 47 / 11
Регистрация: 08.04.2022
Сообщений: 187
06.10.2022, 08:07
Цитата Сообщение от nezabudka Посмотреть сообщение
можно пойти на хитрость
nezabudka, согласен. Есть много способов сделать красиво. Я не претендую на свои варианты как на самые лучшие. RS='[[:space:]]+' - весьма очевидное решение, а я и не додумался о нем, хотя сам нечто-то подобное писал.

Лично мне не нравится интерактивность в CLI (хотя допускаю, что без этого иногда не обойтись), и считаю, что все взаимодействие с программой, а тем более скриптом должно быть только через параметры командной строки.

Добавлено через 4 минуты
Цитата Сообщение от nezabudka Посмотреть сообщение
;;&
Очень интересно! Хак или недокументированная возможность?
0
Эксперт NIX
 Аватар для nezabudka
3334 / 752 / 252
Регистрация: 28.06.2015
Сообщений: 1,552
Записей в блоге: 16
06.10.2022, 08:23
Цитата Сообщение от siberian-man Посмотреть сообщение
Очень интересно! Хак или недокументированная возможность?
Очень даже документированные три оператора ;; ;;& ;&;
Code
1
LESS=+/^\ \*case man bash
Добавлено через 5 минут
Еще вариант:
Bash
1
2
3
4
5
6
7
8
9
10
#!/bin/bash
 
awk '
BEGIN   {print "Enter operation [<>=] and number: "
        getline <"/dev/stdin"; op = $1; nm = $2}
op == "<" && $0 < nm {print}
op == ">" && $0 > nm {print}
op == "=" && $0 == nm {j++}
END {if(j)print j}
' RS='[[:space:]]+' file
0
322 / 47 / 11
Регистрация: 08.04.2022
Сообщений: 187
06.10.2022, 08:23
Нашел. Судя по описанию - фича баша версии от 4 и выше.
https://tldp.org/LDP/abs/html/special-chars.html
https://tldp.org/LDP/abs/html/bashver4.html
0
Эксперт NIX
 Аватар для nezabudka
3334 / 752 / 252
Регистрация: 28.06.2015
Сообщений: 1,552
Записей в блоге: 16
06.10.2022, 09:13
Цитата Сообщение от siberian-man Посмотреть сообщение
Судя по описанию - фича баша версии от 4 и выше.
Позаимствовано из ksh93 в bash 4.0 (2009г)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.10.2022, 09:13
Помогаю со студенческими работами здесь

Программа для подсчета сколько каждого символа в текстовом файле
Доброе время суток! Нужно написать программу, которая подсчитает сколько раз повторяется каждый символ в текстовом файле и записывает...

Создать приложение для подсчета количества пробел в текстовом файле
Использовать оператор цикла while.

Составьте программу для подсчета числа слов в текстовом файле
Составьте программу для подсчета числа слов в текстовом файле.

Создание программы для подсчета количества слов, знаков, пробелов в текстовом файле
Создание программы для подсчета количества слов, знаков, пробелов в текстовом файле

Необходимо описать рекурсивную функцию для подсчёта количества запятых в текстовом файле
Необходимо описать рекурсивную функцию для подсчёта количества запятых в текстовом файле. Код есть,но он неправильный, так как выдает...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru