LINUX.ORG.RU

поиск каждого слова по файлах и записать их в отдельные новые файлы (по одному слову на файл)

 


1

1

Как переписать? Читать титл

#!/bin/bash

# Это функция, которая делает «типа, записал»
tipa_write() {
    touch $1
    while [ "$(wc -c < $1)" -lt $MAX_FILESIZE ]; do
        grep -E "ABV|АКАМУЛЯТОР" "$HOME/$APPS/"* | awk '{print strftime(" %Y-%m-%d %H:%M:%S "), $0}' >> $1
        # тут логика твоего типа, записал
    done
}

# Это цикл, который делает «записал, сжал, удалил для $NUMBER_OF_FILES файлов
# с именами по номерам (в примере — от 1 до 100)
for FILENUM in $(seq $NUMBER_OF_FILES); do
    DATE=`date +%d-%m-%Y-%R:%S:%N`
    echo "файл" ${0} >> "$HOME/$CYCLE/$DATE-$FILENUM"
    cat "$HOME/$MAG" >> "$HOME/$CYCLE/$DATE-$FILENUM"
    tipa_write "$HOME/$CYCLE/$DATE-$FILENUM"
    # жмём
    lzma "$HOME/$CYCLE/$DATE-$FILENUM"*
    # удаляем непожатое
    rm -f "$HOME/$CYCLE/$DATE-$FILENUM"
    mv "$HOME/$CYCLE/$DATE-$FILENUM"* "$HOME/$FILE/"
    echo $DATE-$FILENUM >> "$HOME/$FILE/filenum.txt"
done



Последнее исправление: zte (всего исправлений: 2)
Ответ на: комментарий от kaldeon

Если что, он уже полтора года эту фигню мучает (до нынешней итерации была ещё куча тем, с таким же уровнем формулирования задачи…)

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от firkax

Тут можно провести аналогию с фрейдизмом. Суть же не в том, чтоб письки разглядывать, просто Эрос настолько пронизывает всё человеческое существо, что если что-то в голове поломано, то на сексуальной сфере это обязательно отразится. Так и тут, где-то с головой беда и способность связно излагать свои мысли на русском языке пошла в пешее эротическое путешествие. Если эту проблему решить, то и «поиск каждого слова по файлах и записать их в отдельные новые файлы (по одному слову на файл)» сразу получится.

ugoday ★★★★★
()
17 января 2026 г.
Ответ на: комментарий от ugoday

Что не понятного? Нужно, например что бы 5 текстовых файлов умножалось например на 5 тобишь из одного было 5

Скрипт должен быть на bash

zte
() автор топика
Последнее исправление: zte (всего исправлений: 1)
Ответ на: комментарий от zte

Нужно, например что бы 5 текстовых файлов умножалось например на 5

Скажите пожалуйста, на каком курсе преподают правила умножения файла на скаляр? Я думал, что знаю математику, но это прошло мимо меня.

CrX ★★★★★
()
touch $1

Создаём файл(ы), несколько, если в имени файла имеется пробел.

while [ "$(wc -c < $1)" -lt $MAX_FILESIZE ]; do

Делаем до тех пор, пока количество символов из файла $1 меньше ничего (переменная не определена), test падает с ошибкой синтаксиса:

[: -lt: argument expected
# тут логика твоего типа, записал

Но логики у тебя нет. (=

DATE=`date +%d-%m-%Y-%R:%S:%N`

Выбран самый всратый для сортировки формат дат: вначале вначале все файлы первого числа всех месяцев всех годов. (%

echo "файл" ${0} >> "$HOME/$CYCLE/$DATE-$FILENUM"

Записываем имя самого скрипта в каждый новый файл. Мало ли, вдруг забудем как называется этот скрипт. (%

cat "$HOME/$MAG" >> "$HOME/$CYCLE/$DATE-$FILENUM"

Переменная не определена, попытка вывести содержимое директории с помощью cat:

cat: /home/zte/: Is a directory
# жмём
lzma "$HOME/$CYCLE/$DATE-$FILENUM"*
# удаляем непожатое
rm -f "$HOME/$CYCLE/$DATE-$FILENUM"

Жмём всё по wildcard, но удаляем только один файл.

echo $DATE-$FILENUM >> "$HOME/$FILE/filenum.txt"

Записываем в файл 17-01-2026-09:44:34:581442624-, потому что переменная $FILENUM не определена.

Не думал, что Zhong Xing Telecommunication Equipment настолько плохо пишет код. (% А ведь делают смартфоны и роутеры!

mord0d ★★★★★
()
Последнее исправление: mord0d (всего исправлений: 1)
Ответ на: комментарий от legolegs

зачем в целом в 2к26 писать на баше кроме однострочников с пайпами, когда питухон 2 (по меньшей мере) уже в каждом дистре?

SpaceRanger ★★★
()
Последнее исправление: SpaceRanger (всего исправлений: 1)
Ответ на: комментарий от SpaceRanger

Если в питон бездумно тыкать непонятные рандомные строчки, он ошибку выдаст. Если в баш, то оно запустится и как-то там отработает — не так, как надо, может снесёт пол-системы, если не повезёт (с таким подходом рано или поздно случится, вангую), но отработает. Это даёт иллюзию, что на баше писать «получается», а на питоне — нет.

CrX ★★★★★
()

Спросил гопоту, что пользователь имел ввиду с этим вот всем.

Результат такой:

Вот исправленный скрипт, соответствующий вашей задаче разделения результатов по словам в отдельные файлы:

#!/bin/bash

# Настройки (можно вынести в переменные окружения)
APPS_DIR="$HOME/apps"          # Директория с исходными файлами
OUTPUT_DIR="$HOME/cycle"       # Временная директория
ARCHIVE_DIR="$HOME/file"       # Директория для архивов
WORDS=("ABV" "АКАМУЛЯТОР" "word3" "word4" "word5") # 5 искомых слов
MAX_FILESIZE=1048576           # Макс. размер файла (1 МБ)
TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")

# Создаём директории
mkdir -p "$OUTPUT_DIR" "$ARCHIVE_DIR"

# Обработка каждого слова
for word in "${WORDS[@]}"; do
    # Формируем имя файла с временной меткой
    RAW_FILE="$OUTPUT_DIR/${word}_$(date +%d-%m-%Y-%H-%M-%S-%N).log"
    
    # Собираем все совпадения по слову из всех файлов
    {
        # Добавляем "заголовок" из файла MAG (если нужно)
        [ -f "$HOME/mag.txt" ] && cat "$HOME/mag.txt"
        
        # Ищем совпадения во всех файлах
        grep -r --no-filename -h "\b${word}\b" "$APPS_DIR"/ 2>/dev/null | \
        awk -v ts="$TIMESTAMP" '{print ts " " $0}'
    } > "$RAW_FILE"
    
    # Проверяем размер и архивируем
    if [ -s "$RAW_FILE" ]; then
        if [ "$(stat -c%s "$RAW_FILE")" -gt "$MAX_FILESIZE" ]; then
            split -b "$MAX_FILESIZE" -d "$RAW_FILE" "$RAW_FILE.part_"
            rm "$RAW_FILE"
            for part in "$RAW_FILE.part_"*; do
                lzma -9 "$part"
                mv "$part.lzma" "$ARCHIVE_DIR/"
            done
        else
            lzma -9 "$RAW_FILE"
            mv "$RAW_FILE.lzma" "$ARCHIVE_DIR/"
        fi
        
        # Логируем созданные файлы
        echo "$(basename "$RAW_FILE")" >> "$ARCHIVE_DIR/filenum.txt"
    fi
done

Что делает скрипт:

  1. Для каждого из 5 указанных слов создаёт отдельный файл
  2. Ищет точные вхождения слова (\b обозначает границу слова) во всех файлах директории apps
  3. Добавляет единую временную метку в начало каждой строки с совпадением
  4. Если указан файл mag.txt – добавляет его содержимое в начало результата
  5. Автоматически разбивает файлы на части при превышении MAX_FILESIZE
  6. Сжимает результаты через lzma и перемещает в архивную директорию
  7. Ведёт лог созданных файлов в filenum.txt

Особенности:

  • Имя файла включает само слово для удобства идентификации
  • Используется точный поиск по словам (не подстрокам)
  • Эффективная обработка больших файлов через split
  • Все настройки в начале скрипта легко модифицируются
  • Безопасная обработка ошибок (игнорирование stderr в grep)

Как использовать:

  • Поместите исходные файлы в $HOME/apps
  • При необходимости создайте файл $HOME/mag.txt с общим заголовком
  • Настройте переменные в начале скрипта под вашу задачу
  • Запустите скрипт – результаты появятся в $HOME/file

Пример результата для слова «ABV»:

ABV_17-01-2026-14-30-45-123456.log.lzma       (если файл <1МБ)
ABV_17-01-2026-14-30-45-123456.log.part_00.lzma (если разбит на части)

Для изменения количества слов просто добавьте/удалите элементы в массив WORDS.

praseodim ★★★★★
()
Ответ на: комментарий от zte

Я был на всенощной сегодня и Господь напомнил мне о вас и послал мысль: попробуйте перестать описывать части решения, мы всё равно не в силах разобраться как числа и файлы перемножать. Вместо этого лучше придумайте пример, полностью опишите входные данные и что из них должно получиться. Что-то в стиле разработки через тестирование.

ugoday ★★★★★
()
Ответ на: комментарий от firkax

ТС парой сообщений выше сказал,что это то что нужно...

Так вот. Гопота лучше местных кожаных справилась с пониманием вопроса.

praseodim ★★★★★
()
Последнее исправление: praseodim (всего исправлений: 1)
Ответ на: комментарий от praseodim

Жди через 3 месяца следующую тему, где он вот этот твой скрипт, с рандомно внесёнными правками, вывалит и спросит ещё какой-нить невразумительный вопрос.

firkax ★★★★★
()