Как решить проблему с 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
→ Ссылка