2013-03-05 3 views
3

Вопрос в том, можно ли назначить переменную bash в awk-скрипте.Назначить ассоциативный массив bash в awk

т.е. Предполагая Ниже приведен сценарий оболочки Я написал,

declare -A sample_associative_array 
awk -F'=' '{$sample_associative_array[$2]=$1}' /tmp/sample.txt 

данный /tmp/sample.txt имеет:

abc=0 
def=1 

Я попытался

echo $sample_associative_array[0] 

и его не работает.

Любая помощь будет оценена по достоинству.

Cheers!

ответ

2

Вы не можете этого сделать. Awk и Bash используют совершенно разные области переменных и позволяют использовать переменные, объявленные в другом, будут большим нарушением суверенитета процесса.

То, что вы пытаетесь сделать, может быть очень просто выполнено с помощью Bash с помощью расширения параметров с удалением префикса/суффикса, например. ${parameter#word} и ${parameter%word}. Для получения дополнительной информации обратитесь к руководству Bash.

Кроме того, ссылки массива в Bash используют другой синтаксис: ${sample_associative_array[0]} - это то, что вы хотите.

+0

Благодарим за отзыв. Да, в отношении echo $ {sample_array [0]}, я знал это, но как-то пропустил это. Можете ли вы рассказать мне, что мне нужно для поиска относительно расширения этого параметра? Было бы здорово, если бы вы могли привести пример. Ура! – Ricketyship

+0

Хорошо, понял! Большое спасибо за ответ! Для тех, кто ищет такой вид матча, вот хорошая статья: http://www.linuxjournal.com/content/bash-parameter-expansion – Ricketyship

+1

@Unsung: Поиск 'man bash' для' Arrays': * Any элемент массива может ссылаться на $ {name [subscript]}. * – cdarke

1

Нет. Детский процесс не может назначать переменную родителя, у вас будет эта проблема независимо от языка. awk не может даже напрямую a bash ассоциативный массив, так как вы не можете экспортировать массив из bash (или любой другой оболочки, о которой я знаю).

Вы всегда будете сталкиваться с такими проблемами при попытке смешать языки. Общий совет - написать всю партию либо в bash, либо в awk, оба достаточно мощные.

+0

Хорошо объяснено! Глядя на это с точки зрения процесса, он становится немного понятнее. – Ricketyship

4

Не совсем то же самое, но вы можете иметь awk строки вывода, которые могут использоваться встроенной командой bashdeclare для заполнения ассоциативного массива. Я не совсем уверен, почему вы хотели бы это сделать.

$ declare $(awk -F'=' '{print "aa["$2"]="$1}' sample.txt) 
$ echo ${aa[0]} 
abc 
$ echo ${aa[1]} 
def 
+0

Я хотел прочитать файл и получить из него ассоциативный массив. И по моему опыту, я чувствовал, что awk будет естественным кандидатом на это. Поэтому я пошел туда. Но теперь я собираюсь использовать обычный вариант расширения параметров, предоставляемый bash. Я выполняю сопоставление префикса и суффикса по данным и заполняя свой ассоциативный массив. Спасибо за альтернативный метод. Ценить это! – Ricketyship

Смежные вопросы