Проблема с awk ward

Существуют эти 2 модуля Perl, которые похожи, они делают то, что Вы ищете:

Да их называют теми именами. Существуют примеры на ссылочных страницах обоих тех модулей CPAN, которые показывают, как сделать то, что Вы спрашиваете. Makefile::GraphViz смыслы для создания более сложных графиков, чем GraphViz::Makefile.

Существует также инструмент командной строки, который идет Makefile::GraphViz названный gvmake то, что можно использовать для генерации графиков, не пишущий программ Perl.

Например:

$ gvmake

Выполнит цель по умолчанию в Вашем Makefile, typcically all, и вывод a all.png файл.

4
09.10.2015, 17:59
3 ответа

вы почти сделали это

i=1
first_file=$(echo "$selected" | awk -v n="$i" -F'|'  '{print $n}')
  • переменная устанавливается с помощью -v name = value
3
27.01.2020, 20:49

Ваш $ 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 
     
4
27.01.2020, 20:49

Значение $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'}')"
2
27.01.2020, 20:49

Теги

Похожие вопросы