Как решить проблему с bash скриптом
Такой вопрос. У меня есть скрипт bash.
Он делает следующее:
В папке temp у меня есть несколько текстовых файлов со списком цифр например
первый:
1
2
3
Второй:
1
2
3
4
Cкрипт должен сравнить эти 2 файла и записать их в отдельный.
Третий файл с суммой множеств обработанных файлов:
1
2
3
4
Но у меня так не работает. Он пропускает последнюю цифру в списке
и результат получается такой:
1
2
3
Там еще есть папка banned со списком, который не должен быть в итоговом файле.
Там нет цифер, которые он пропускает в конце.
И мне кажется, что проблема в цикле.
вот сам скрипт:
UPLOAD_DIR="./temp"
COMPLETED_DIR="./completed"
BANNED_FILE="./banned/banned.txt"
OUTPUT_FILE="./merged_output.txt"
# Создаем или очищаем итоговый файл
> "$OUTPUT_FILE"
# Создаем директорию для завершенных файлов, если она не существует
mkdir -p "$COMPLETED_DIR"
# Читаем содержимое banned файла в массив
declare -A banned_lines
while IFS= read -r line; do
banned_lines["$line"]=1
done < "$BANNED_FILE"
# Обрабатываем каждый файл в директории и объединяем их в один поток
for file in "$UPLOAD_DIR"/*; do
if [[ -f "$file" ]]; then
# Удаляем пустые строки, пробелы и проверяем на совпадение с banned
while IFS= read -r line; do
clean_line=$(echo "$line" | sed 's/^[ \t]*//;s/[ \t]*$//') # Удаляем пробелы в начале и конце
if [[ -n "$clean_line" && -z "${banned_lines["$clean_line"]}" ]]; then
echo "$clean_line" >> "$OUTPUT_FILE"
fi
done < "$file"
# Переносим файл в папку completed
mv "$file" "$COMPLETED_DIR/"
fi
done
# Удаляем дубликаты из окончательного файла
sort -u -o "$OUTPUT_FILE" "$OUTPUT_FILE"
# Сравниваем строки в merged_output.txt с banned.txt и удаляем совпадения
grep -Fvxf "$BANNED_FILE" "$OUTPUT_FILE" > temp_output && mv temp_output "$OUTPUT_FILE"
# Удаляем пустые строки, если они остались
sed -i '/^$/d' "$OUTPUT_FILE"
echo "Файлы обработаны, дубликаты удалены, и перемещены в $COMPLETED_DIR. Итоговый файл: $OUTPUT_FILE ```
Ответы (2 шт):
Автор решения: SVBazuev
→ Ссылка
Попробуйте предварительно заменять пробелы на '\n'
# Удаляем пустые строки, пробелы и проверяем на совпадение с banned
tr ' ' '\n' < "$file" | while IFS= read -r line; do
# больше изменений нет.
Автор решения: Ivan
→ Ссылка
Можно упростить вот так:
# тестовые файлы
$ cat f1
1
2
3
$ cat f2
1
2
3
4
$ cat f3
5
# banned
$ cat b
5
# сортируем
$ sort -u f1 f2 f3
1
2
3
4
5
# баним
$ sort -u f1 f2 f3 | grep -v -f b
1
2
3
4