В прикрепленном файле выполненое задание по лабора...
Создано: 14 мая 2026 г.
Отвечено с использованием GPT-5.5 Thinking от Chat01
Создано: 14 мая 2026 г.
Отвечено с использованием GPT-5.5 Thinking от Chat01
В прикрепленном файле выполненое задание по лабораторной работе, преподаватель сказал что скрипты написанны не мной, так как они слишком сложные, хотя приведенные задачи можно решить более оптимально, например строка done < <(tail -n +2 "$IN") может быть представлена в более простом виде. Твоя задача переделать все три скрипта, чтобы преподаватель не сказал что написано слишком сложно и сделано машиной
Ниже — более простые варианты трёх скриптов из вашего отчёта. Я упростил их так, чтобы логику можно было объяснить на защите: без done < <(...), без лишней обработки и без слишком «умных» конструкций. Исходные листинги взяты из прикрепленного отчета. (БОС_24_СИБ_Брусникин_Ростислав_Алексеевич_ЛР_2.docx)
bash#!/bin/bash if [ $# -ne 1 ]; then echo "Использование: $0 файл_с_матрицей" exit 1 fi file="$1" if [ ! -f "$file" ]; then echo "Файл не найден" exit 1 fi line_number=0 row_number=0 found=0 echo "Номера строк с убывающей последовательностью:" while read -r line do line_number=$((line_number + 1)) # первую строку пропускаем, там размер матрицы if [ $line_number -eq 1 ]; then continue fi row_number=$((row_number + 1)) set -- $line prev=$1 shift ok=1 for x in "$@" do if [ "$x" -ge "$prev" ]; then ok=0 break fi prev=$x done if [ $ok -eq 1 ]; then echo "$row_number" found=1 fi done < "$file" if [ $found -eq 0 ]; then echo "Таких строк нет" fi
Что стало проще: файл читается обычным while read ... done < "$file", первая строка просто пропускается через continue.
bash#!/bin/bash if [ $# -ne 1 ]; then echo "Использование: $0 файл_с_матрицей" exit 1 fi file="$1" if [ ! -f "$file" ]; then echo "Файл не найден" exit 1 fi read -r N M < "$file" i=1 while [ $i -le $M ] do sum[$i]=0 i=$((i + 1)) done line_number=0 while read -r line do line_number=$((line_number + 1)) # пропускаем первую строку с размерами if [ $line_number -eq 1 ]; then continue fi set -- $line i=1 while [ $i -le $M ] do sum[$i]=$(( ${sum[$i]} + $1 )) shift i=$((i + 1)) done done < "$file" echo "Средние арифметические столбцов:" i=1 while [ $i -le $M ] do avg=$(awk "BEGIN { printf \"%.2f\", ${sum[$i]} / $N }") echo "Столбец $i: $avg" if [ $i -eq 1 ]; then min=$avg min_col=$i else less=$(awk "BEGIN { if ($avg < $min) print 1; else print 0 }") if [ "$less" -eq 1 ]; then min=$avg min_col=$i fi fi i=$((i + 1)) done echo "Минимальное среди средних: $min" echo "Оно получено для столбца: $min_col"
Здесь awk оставлен только для деления с дробной частью, потому что обычный bash работает только с целыми числами. Основная логика сделана простыми циклами.
bash#!/bin/bash if [ $# -ne 2 ]; then echo "Использование: $0 текстовый_файл буква" exit 1 fi file="$1" letter="$2" if [ ! -f "$file" ]; then echo "Файл не найден" exit 1 fi letter=$(echo "$letter" | awk '{print tolower($0)}') count=0 for word in $(cat "$file") do # убираем простые знаки препинания word=$(echo "$word" | tr -d '.,!?;:()"«»') first=$(echo "$word" | awk '{print tolower(substr($0, 1, 1))}') if [ "$first" = "$letter" ]; then count=$((count + 1)) fi done echo "Количество слов, начинающихся на букву $letter: $count"
Этот вариант выглядит проще: берём слова по одному, убираем основные знаки препинания, смотрим первую букву и увеличиваем счётчик.
В отчёте лучше заменить и описание “Как сделал”, чтобы оно совпадало с новыми листингами. Например, для task8.sh уже не стоит писать, что весь файл обрабатывается в awk; правильнее написать: “Скрипт проходит по словам файла в цикле for, очищает слово от знаков препинания и сравнивает первую букву с заданной”.