Как мне вставить новую строку перед конкатенацией? - PullRequest
2 голосов
/ 28 июля 2011

У меня есть около 80000 файлов, которые я пытаюсь объединить.Это:

cat files_*.raw >> All

очень быстро, тогда как следующее:

for f in `ls files_*.raw`; do cat $f >> All; done;

очень медленно.По этой причине я пытаюсь придерживаться первого варианта, за исключением того, что мне нужно иметь возможность вставлять новую строку после того, как каждый файл объединен в All.Есть ли быстрый способ сделать это?

Ответы [ 4 ]

3 голосов
/ 28 июля 2011

А как же

ls files_*.raw | xargs -L1 sed -e '$s/$/\n/' >>ALL

Это будет вставлять дополнительную новую строку в конце каждого файла, когда вы их объединяете.

И параллельная версия, если вам не важен порядок конкатенации:

find ./ -name "*.raw" -print | xargs -n1 -P4 sed -e '$s/$/\n/' >>All
2 голосов
/ 28 июля 2011

Вторая команда может быть медленной, потому что вы открываете файл «Все» для добавления 80000 раз против 1 раза в первой команде.Попробуйте простой вариант второй команды:

for f in `ls files_*.raw`; do cat $f ; echo '' ; done >> All
1 голос
/ 29 июля 2011

Каждый раз, когда awk открывает другой файл для обработки, FRN равен 0, поэтому:

awk '(0==FRN){print ""} {print}' files_*.raw >> All

Обратите внимание, все это делается в одном процессе awk. Производительность должна быть близка к команде cat из вопроса.

1 голос
/ 28 июля 2011

Я не знаю, почему это будет медленно, но я не думаю, что у вас есть большой выбор:

for f in `ls files_*.raw`; do cat $f >> All; echo '' >> All; done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...