Shell-cat - объединить файлы в один большой файл

Я пытаюсь использовать bash для объединения содержимого списка файлов (более 1K) в большой файл.

Я пробовал следующую команду cat:

cat * >> bigfile.txt

однако то, что делает эта команда, это слияние всего, включая также уже объединенные вещи.

например. file1.txt

content1

file2.txt

content2

file3.txt

content3

file4.txt

content4

bigfile.txt

content1
content2
content3
content2
content3
content4
content2

но я бы хотел просто

content1
content2
content3
content4

внутри .txt файла

Другим способом будет cat file1.txt file2.txt ... и т.д.... но я не могу сделать это для более чем 1k файлов!

Благодарим вас за поддержку!

Ответ 1

Проблема заключается в том, что вы помещаете bigfile в тот же каталог, следовательно, являетесь частью *. Так что что-то вроде

cat dir/* > bigfile

должен работать так, как вы этого хотите, с файлами fileN.txt, расположенными в dir/

Ответ 2

При повторном чтении вопроса, вы хотите добавить данные в bigfile.txt, но без добавления дубликатов. Вам нужно пройти все через sort -u, чтобы отфильтровать дубликаты:

sort -u * -o bigfile.txt

Параметр -o для сортировки позволяет безопасно включать содержимое bigfile.txt во вход для сортировки до того, как файл будет перезаписан с выходом.

РЕДАКТИРОВАТЬ: Предполагая, что файл bigfile.txt отсортирован, вы можете попробовать двухэтапный процесс:

sort -u file*.txt | sort -um - bigfile.txt -o bigfile.txt

Сначала мы сортируем входные файлы, удаляя дубликаты. Мы передаем этот вывод другому процессу sort -u, который использует параметр -m, который сообщает sort объединить два ранее отсортированных файла. Два файла, которые мы будем объединять, - это - (стандартный ввод, поток, поступающий от первого sort), и bigfile.txt. Мы снова используем параметр -o, чтобы мы могли записать результат обратно в bigfile.txt после того, как мы прочитали его как ввод.

Ответ 3

Вы можете сохранить выходной файл в том же каталоге, вам просто нужно быть немного сложнее, чем *:

shopt -s extglob
cat !(bigfile.txt) > bigfile.txt

Ответ 4

Другим способом будет cat file1.txt file2.txt... и так далее... но я не могу сделать это более чем на 1k файлов!

Это то, что xargs для:

find . -maxdepth 1 -type f -name "file*.txt" -print0 | xargs -0 cat > bigfile.txt

Ответ 5

Это старый вопрос, но я дам еще один подход с xargs

  • укажите файлы, которые хотите выполнить

    ls | grep [pattern] > filelist

  • Проверьте, что ваши файлы находятся в правильном порядке с помощью vi или cat. Если вы используете суффикс (1, 2, 3,..., N), это не должно быть проблемой

  • Создайте окончательный файл

    cat filelist | xargs cat → [конечный файл]

  • Удалить список файлов

    rm -f filelist

Надеюсь, это поможет кому-то

Ответ 6

Try:

cat `ls -1 *` >> bigfile.txt

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