awk, как изменить значение файла с помощью наборов параметра?

Никакая файловая система (насколько я знаю) не позволяет иметь два файла с тем же именем, и если бы какой-либо из них сделал, то много приложений были бы повреждены или изложили бы опасности безопасности.

Если у Вас есть 2 файла с тем же именем, Вы генерируете неоднозначность: даже если у них есть то же имя файла, но различные идентификаторы, как Вы говорите приложения, какой файл относиться к (этот "открытый файл идентификатором" мог быть сделан, но потребует глубоких изменений во многих приложениях, библиотеки и т.д....)?

1
01.10.2013, 00:07
2 ответа

проблема, с которой Вы сталкиваетесь, состоит в том, что Вы пытаетесь использовать переменные BASH в рамках awk-команды, которая защищена одинарными кавычками ('...'). в одинарных кавычках удар не развернет переменные (например. ${BI2}), таким образом, awk будет буквально видеть $6 = "${BI2}" и это установит значение 6-го столбца к литералу "${B12}".

к счастью можно легко создать awk переменные от shell переменные с помощью --assign (иначе -v) аргумент:

awk \
   -v BI2="${BI2}" \
   -v DS2="${DS2}" \
   -v DSMAX2="${DSMAX2}" \
   -v WS2="${WS2}" \
   -v D22="${D22}" \
   -v D32="${D32}" \
  '{if($1==2)
     {
      $6 = BI2; $7 = DS2; $8 = DSMAX2; $9 = WS2; $25 =D22; $26 =D32; 
     }
    print $0;
  }'
3
27.01.2020, 23:21

Вы помещаете awk сценарий в одинарных кавычках, это обычно рекомендуется, потому что он препятствует тому, чтобы оболочка пыталась заменить переменными, определенными awk, как $1. К сожалению, это также означает, что оболочка не может занять место в переменных, только это знает о, как $BI2. Если Вы переносите Ваш awk вызов в двойных кавычках вместо этого:

awk "{if(\$1==2) {
  \$6 = ${BI2}
  \$7 = ${DS2}
  \$8 = ${DSMAX2}
  \$9 = ${WS2}
  \$25 = ${D22}
  \$26 = ${D32}}
  print \$0;}" soil_params > tmp

затем оболочка заменит ${BI2} и такой. Однако теперь переменные это awk использование, как $1, должны быть записаны как \$1 препятствовать тому, чтобы оболочка пыталась предоставить значения им.

1
27.01.2020, 23:21
  • 1
    я получил awk: обратная косая черта ^ не последний знак на ошибке строки. Это не выполняет результат также. Я хочу $ {BI2} $ {DS2} $ {DSMAX2} $ {WS2}.. и т.д. быть замененным их значениями от присвоенных установленных значений. Я поместил $ {BI2} $ {DS2} $ {DSMAX2} $ {WS2} в моих демонстрационных данных неправильно. Они - числовые значения просто ame как первая строка. –  AiB 30.09.2013, 23:45
  • 2
    @Abraham При определении переменных, попытайтесь заменить set с export, например. export BI2=0.02841513. –  wingedsubmariner 01.10.2013, 03:13

Теги

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