Никакая файловая система (насколько я знаю) не позволяет иметь два файла с тем же именем, и если бы какой-либо из них сделал, то много приложений были бы повреждены или изложили бы опасности безопасности.
Если у Вас есть 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;
}'
Вы помещаете 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
препятствовать тому, чтобы оболочка пыталась предоставить значения им.
set
с export
, например. export BI2=0.02841513
.
– wingedsubmariner
01.10.2013, 03:13