1

Я написал сценарий оболочки для объединения содержимого другого файла. Я создал каталоги f1, f2, d1, d2 и файлы под ними, мне нужно объединить содержимое всех файлов: comand is

(find /home/ah5024331/f1 /home/ah5024331/f2  /home/ah5024331/d1  /home/ah5024331/d2 /home/ah5024331/f1 /home/ah5024331/f2  -type f | xargs -i cat {} ) > t.txt

вывод:

--this is new text from f1 ----
--this is text from f2 ------this is new text from d1 ------this is new text from d2 -----this is new text from f1 ----

Мне нужно добавить новую строку после каждого конца файла, как:

--this is new text from f1 ----
--this is text from f2
------this is new text from d1 
------this is new text from d2 
-----this is new text from f1 ----

Как это сделать?

Любая помощь будет оценена заранее.

3 ответа3

0

Используя GNU Parallel это выглядит так:

(find ...  -type f | parallel -j1 cat {}';'echo ) > t.txt

GNU Parallel - это общий параллелизатор, который позволяет легко запускать задания параллельно на одной и той же машине или на нескольких машинах, к которым у вас есть доступ по ssh. И это также может заменить множество циклов for как в этом случае.

Если у вас есть 32 различных задания, которые вы хотите запустить на 4 процессорах, прямой способ распараллеливания - запустить 8 заданий на каждом процессоре:

Простое планирование

GNU Parallel вместо этого порождает новый процесс после его завершения - поддерживая процессоры активными и, таким образом, экономя время:

Параллельное планирование GNU

Монтаж

Если GNU Parallel не упакован для вашего дистрибутива, вы можете выполнить личную установку, которая не требует root-доступа. Это можно сделать за 10 секунд, выполнив это:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Для других вариантов установки см. Http://git.savannah.gnu.org/cgit/parallel.git/tree/README.

Учить больше

Смотрите больше примеров: http://www.gnu.org/software/parallel/man.html

Посмотрите вступительные видеоролики: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Просмотрите учебник: http://www.gnu.org/software/parallel/parallel_tutorial.html

Подпишитесь на список рассылки, чтобы получить поддержку: https://lists.gnu.org/mailman/listinfo/parallel

0

Попробуй это:

#!/bin/bash
for f in $(find /home/ah5024331/f1 /home/ah5024331/f2 \
    /home/ah5024331/d1 /home/ah5024331/d2 -type f)
do
    cat "$f" >> t.txt
    echo >> t.txt
done

Это добавит новую строку после конца каждого файла, однако, если у любого из этих файлов уже есть новая строка в конце, вы увидите дополнительную пустую строку в выводе (как упомянуто @mnmnc в комментариях ).

0

Создайте фиктивный файл с новой строкой.

echo -n "" > /tmp/newline.txt

Теперь выполните ваш скрипт, как показано ниже.

(find /home/ah5024331/f1 /home/ah5024331/f2  /home/ah5024331/d1  /home/ah5024331/d2 /home/ah5024331/f1 /home/ah5024331/f2  -type f | xargs -i cat {} /tmp/newline.txt ) > t.txt

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .