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, чтобы проверить ее для вас в первую очередь.