Существуют эти 2 модуля Perl, которые похожи, они делают то, что Вы ищете:
Да их называют теми именами. Существуют примеры на ссылочных страницах обоих тех модулей CPAN, которые показывают, как сделать то, что Вы спрашиваете. Makefile::GraphViz
смыслы для создания более сложных графиков, чем GraphViz::Makefile
.
Существует также инструмент командной строки, который идет Makefile::GraphViz
названный gvmake
то, что можно использовать для генерации графиков, не пишущий программ Perl.
Например:
$ gvmake
Выполнит цель по умолчанию в Вашем Makefile
, typcically all
, и вывод a all.png
файл.
вы почти сделали это
i=1
first_file=$(echo "$selected" | awk -v n="$i" -F'|' '{print $n}')
Ваш $ i
- переменная оболочки, awk
не имеет к ней доступа, поэтому $ i
оценивается как пустая. Вы можете i) использовать двойные кавычки для сценария awk
, чтобы оболочка расширяла в нем переменные перед передачей их на awk
для выполнения, либо ii) передать его на awk
как переменную awk
:
Используйте двойные кавычки. Обратите внимание: поскольку оболочка теперь расширяет переменные, вам нужно экранировать первый $
, чтобы он передавался в awk
и не интерпретировался оболочкой:
$ i = 1
$ first_file = $ (echo "$ selected" | awk -F '|' "{print \ $$ n}")
$ echo "$ first_file"
a2.flac
Передайте переменную awk
. У вас был синтаксис почти правильно:
$ first_file = $ (echo "$ selected" | awk -F '|' -vi = "$ i" '{print $ i}') {{ 1}} $ echo "$ first_file"
a2.flac
Значение $i задается оболочкой, для этого строка должна быть либо в двойных кавычках, либо без кавычек. Таким образом, ваша строка:
i=1; first_file=$(echo "$selected" | awk -F'|' '{print $i}') # original
i=1; first_file=$(echo "$selected" | awk -F'|' '{print $'$i'}') # un-quoted
i=1; first_file=$(echo "$selected" | awk -F'|' '{print $'"$i"'}') # double-quoted
i=1; first_file=$(echo "$selected" | awk -F'|' "{print \$$i}") # full double-quoted
Конечно, вы можете, и это самый правильный способ сделать это, сказать awk, что является значением var, и использовать его (я использовал jj, чтобы сделать разницу в именах переменных явной):
i=1; first_file=$(echo "$selected" | awk -F'|' -v jj="$i" '{print $jj}')
Возможно, более идиоматичным способом будет (без под-оболочки из-за трубы "|"):
i=1; first_file="$( <<<"$selected" awk -F\| '{print $'$i'}')"