Загрузка данных


#!/bin/bash

MyName="Ivanov"
ErrorLog="./error.log"

exec 3> "$ErrorLog"
exec 2>&3

show_help() {
    echo "Использование: $0 <номер_основного_файла> <файл1> <файл2> ... [файлN]" >&1
    echo "Пример: $0 2 file1.txt file2.txt file3.txt" >&1
    echo "Где <номер_основного_файла> — это индекс (начиная с 1) основного файла в списке." >&1
}

if [ $# -eq 0 ]; then
    echo "Ошибка: Не указаны параметры." >&2
    show_help
    exit 1
fi

if [ "$1" == "--help" ]; then
    show_help
    exit 0
fi

if [ $# -lt 2 ]; then
    echo "Ошибка: Недостаточно параметров для выполнения задания." >&2
    show_help
    exit 1
fi

main_file_index=$1
shift 

files=("$@")
total_files=${#files[@]}

if [ "$main_file_index" -lt 1 ] || [ "$main_file_index" -gt "$total_files" ]; then
    echo "Ошибка: Index основного файла ($main_file_index) вне диапазона (1..$total_files)." >&2
    exit 1
fi

for file in "${files[@]}"; do
    if [ ! -r "$file" ]; then
        echo "Ошибка: Файл '$file' не существует или недоступен для чтения." >&2
        exit 2
    fi
done

main_file="${files[$((main_file_index - 1))]}"
main_basename=$(basename "$main_file")

current_time=$(date "+%Y-%m-%d %H:%M:%S")
echo "=== RUNNING SCRIPT at $current_time by $MyName for TASK #11 ===" >&1

line_num=1

while IFS= read -r line || [ -n "$line" ]; do
    
    pattern_clean=$(echo "$line" | sed -E 's/^[[:space:]]*([^[:space:]]+).*/\1/')
    
    if [ -z "$pattern_clean" ]; then
        continue
    fi

    echo -e "[$line_num]\t\t \"$pattern_clean\"" >&1

    for (( i=0; i<total_files; i++ )); do
        if [ $i -eq $((main_file_index - 1)) ]; then
            continue
        fi

        current_file="${files[$i]}"

        while IFS= read -r sub_line || [ -n "$sub_line" ]; do
            
            if [[ "$sub_line" == *'!'* ]]; then
                
                if [[ "$sub_line" == *"$pattern_clean"* ]]; then
                    
                    replaced_line=$(echo "$sub_line" | sed "s/$pattern_clean/$main_basename/g")
                    char_count=$(echo -n "$replaced_line" | wc -m)

                    echo -e "${char_count}\t$(basename "$current_file")\t$replaced_line" >&1
                fi
            fi
        done < "$current_file"
    done

    ((line_num++))
done < "$main_file"

exec 3>&-

exit 0