Для конкретной ситуации, которую вы описываете, используя предоставленные вами примеры файлов, есть очень простой ответ, использующий m4 - стандартный инструмент GNU Linux, который должен быть установлен по умолчанию в большинстве дистрибутивов.
Создать файл merge123.m4
с таким содержанием:
digraph 123 {
define(`digraph',`subgraph')
include(1.dot)
include(2.dot)
include(3.dot)
}
и выполните его с помощью команды
m4 merge123.m4 > 123.dot
и полученный 123.dot
файл будет
digraph 123 {
subgraph {
A -> B
A -> C
}
subgraph {
D -> E
E -> F
}
subgraph {
D -> G
G -> A
}
}
Если вам не нравятся пустые строки, закройте каждую строку в скрипте с помощью dnl
(встроенный dnl
означает «Discard to Next Line» :), например
include(1.dot)dnl
m4
чрезвычайно полезен, поскольку добавляет в graphviz
функции, которые действительно полезны для более вовлеченных проектов; см. также этот вопрос SO .
отредактировано, чтобы ответить на вопрос в комментарии:
Если вам нужно включить файлы и вы не знаете их номера и названия, у вас есть (как минимум) два варианта:
1) Если количество файлов довольно мало, и вы знаете все имена, которые они могут иметь, вы можете sinclude()
всех их:
digraph 123 {
define(`digraph',`subgraph')
sinclude(1.dot)
sinclude(2.dot)
sinclude(3.dot)
sinclude(4.dot)
sinclude(5.dot)
}
m4
будет включать только файлы, которые действительно существуют, и не будет жаловаться на отсутствующие (s
означает «без звука»).
2) Если вы создаете большее количество .dot
файлов с непредсказуемыми именами, вам необходимо выполнить некоторую предварительную обработку. Создайте скрипт оболочки include.sh
, похожий на этот
#!/bin/sh
# get *.dot files (or any pattern you like) into one place
ls *.dot > files.txt
# bring them into a format m4 likes
awk '{print "include(" $1 ")" "dnl"}' files.txt > includes.txt
#done
includes.txt
теперь предоставляет m4
необходимую информацию:
include(1.dot)dnl
include(2.dot)dnl
include(3.dot)dnl
Теперь измените ваш файл merge.m4
, чтобы он мог использовать предоставленный список файлов (я добавляю dnl
здесь, чтобы избежать большого количества свободного места в получающемся объединенном файле):
### merge dot files
digraph 123 {
define(`digraph',`subgraph')dnl
syscmd(`./include.sh')dnl
include(`includes.txt')dnl
}
Чтобы сохранить полученный файл отдельно от входных файлов, лучше использовать другое расширение при объединении:
m4 merge.m4 > merged.gv
, который теперь выглядит как
### merge dot files
digraph 123 {
subgraph {
A -> B
A -> C
}
subgraph {
D -> E
E -> F
}
subgraph {
D -> G
G -> A
}
}