EDIT: Если ваш интернет-поиск torsion.awk
привел вас сюда, просто перейдите выше к принятому ответу, так как он использует усовершенствованный алгоритм OP для вычисления кручения, но все же демонстрирует преобразование кода оболочки в awk
.
Предыдущие читатели также отмечают улучшения в использовании этого кода во втором редактировании ниже.
Я только что заметил оговорку "правильно" в конце ;-/
Вот ваш код, преобразованный в один процесс awk.
У меня нет опыта работы с этим уровнем математики, поэтому я не могу сказать, что он действительно вычисляет нужный вам результат.
Кроме того, часто возникают вопросы о точности в awk-программах, которые на самом деле относятся к базовым c
языковым библиотекам, которые компилируются.
В любом случае, со всеми оговорками, вот базовое преобразование вашего кода.
кот torsion_docd.awk
#!/bin/awk -f
function acos(x) { return atan2((1.-x^2)^0.5,x) }
# x1=`awk '{print $2}' LINEA` # x1
# y1=`awk '{print $3}' LINEA` # y1
# z1=`awk '{print $4}' LINEA` # z1
# x2=`awk '{print $2}' LINEB` # x2
# y2=`awk '{print $3}' LINEB` # y2
# z2=`awk '{print $4}' LINEB` # z2
# x3=`awk '{print $2}' LINEC` # x3
# y3=`awk '{print $3}' LINEC` # y3
# z3=`awk '{print $4}' LINEC` # z3
# x4=`awk '{print $2}' LINED` # x4
# y4=`awk '{print $3}' LINED` # y4
# z4=`awk '{print $4}' LINED` # z4
NR==1 {x1=$2; y=$3; z1=$4}
NR==2 {x2=$2; y=$3; z2=$4}
NR==3 {x3=$2; y=$3; z3=$4}
NR==4 {
x4=$2; y=$3; z4=$4
# all of this code below is only executed when you read in the 4th line
# becuase then you have all the data
# v1x=`calc "($x1)-($x2)" | sed 's/^\t//g'`
# v1y=`calc "($y1)-($y2)" | sed 's/^\t//g'`
# v1z=`calc "($z1)-($z2)" | sed 's/^\t//g'`
# v2x=`calc "($x4)-($x3)" | sed 's/^\t//g'`
# v2y=`calc "($y4)-($y3)" | sed 's/^\t//g'`
# v2z=`calc "($z4)-($z3)" | sed 's/^\t//g'`
v1x=x1-x2 ; v1y=y1-y2 ; v1z=z1-z2
v2x=x4-x3 ; v2y=y4-y3 ; v2z=z4-z3
# v1mag=`calc "sqrt(($v1x)**2+($v1y)**2+($v1z)**2)" | sed 's/^\t//g'`
# v2mag=`calc "sqrt(($v2x)**2+($v2y)**2+($v2z)**2)" | sed 's/^\t//g'`
v1mag=sqrt((v1x)**2+(v1y)**2+(v1z)**2)
v2mag=sqrt((v2x)**2+(v2y)**2+(v2z)**2)
# calc "acos((($v1x)/($v1mag))*(($v2x)/($v2mag))+(($v1y)/($v1mag))*(($v2y)/($v2mag))+(($v1z)/($v1mag))*(($v2z)/($v2mag)))*180/3.141
592653589793" | sed 's/^\t//g' | sed 's/^~//g'
# calc "acos((($x1)*($x4)+($y1)*($y4)+($z1)*($z4))/(sqrt(($x1)**2+($y1)**2+($z1)**2)*sqrt(($x4)**2+($y4)**2+($z4)**2)))*180/3.14159
2653589793" | sed 's/^\t//g' | sed 's/^~//g'
print acos(((v1x)/(v1mag))*((v2x)/(v2mag))+((v1y)/(v1mag))*((v2y)/(v2mag))+((v1z)/(v1mag))*((v2z)/(v2mag)))*180/3.141592653589793
print acos(((x1)*(x4)+(y1)*(y4)+(z1)*(z4))/(sqrt((x1)**2+(y1)**2+(z1)**2)*sqrt((x4)**2+(y4)**2+(z4)**2)))*180/3.141592653589793
}
А без конверсионной документации это выглядит как
кот торсион.awk
#!/bin/awk -f
function acos(x) { return atan2((1.-x^2)^0.5,x) }
NR==1 {x1=$2; y=$3; z1=$4}
NR==2 {x2=$2; y=$3; z2=$4}
NR==3 {x3=$2; y=$3; z3=$4}
NR==4 {
x4=$2; y=$3; z4=$4
# all of this code below is only executed when you read in the 4th line
# because then you have all the data
v1x=x1-x2 ; v1y=y1-y2 ; v1z=z1-z2
v2x=x4-x3 ; v2y=y4-y3 ; v2z=z4-z3
v1mag=sqrt((v1x)**2+(v1y)**2+(v1z)**2)
v2mag=sqrt((v2x)**2+(v2y)**2+(v2z)**2)
print acos(((v1x)/(v1mag))*((v2x)/(v2mag))+((v1y)/(v1mag))*((v2y)/(v2mag))+((v1z)/(v1mag))*((v2z)/(v2mag)))*180/3.141592653589793
print acos(((x1)*(x4)+(y1)*(y4)+(z1)*(z4))/(sqrt((x1)**2+(y1)**2+(z1)**2)*sqrt((x4)**2+(y4)**2+(z4)**2)))*180/3.141592653589793
}
Обратите внимание, что я добавил операторы печати перед двумя последними строками acos
.
На моей машине я запускаю его как
awk -f torsion.awk data.txt
EDIT: я исправил #!/bin/awk
в верхней части скрипта. Итак, вам нужно пометить скрипт как исполняемый с помощью
chmod +x ./torsion.awk
И тогда вы можете запустить его так же, как
`./torsion.awk data.txt
В вашей системе может потребоваться другой путь к awk
, как в верхней строке (#!/bin/awk
). Введите which awk
, а затем используйте это значение после #!
. Кроме того, в устаревших реализациях Unix часто установлены другие версии awk
, поэтому, если это ваша операционная среда, проведите небольшое исследование, чтобы выяснить, какая из них является лучшей awk
в вашей системе (часто это gawk
).
# -------------- end edit --------------------
вывод
87.6318
131.872
Но учитывая, что вы согласились с тем, что -58.7
является вашим желаемым результатом, я оставлю вам решать, как использовать 2 вычисления acos
.
В любом случае, надеюсь, вы видите, насколько проще использовать awk
для таких вычислений.
Конечно, надеясь, что настоящие математики проберутся (вдоволь посмеявшись) и помогут это исправить (или предложат свои идеи).
IHTH
person
shellter
schedule
09.10.2017
-58.7
? - person RomanPerekhrest   schedule 09.10.2017bash
действительно неправильный язык для использования здесь. Вы могли бы (почти) сделать все это с помощью одного сценарияawk
, но использование надлежащего языка программирования общего назначения было бы намного проще. - person chepner   schedule 09.10.2017LINE[A-D]
? Многое легко сделать за один процессawk
. Удачи. - person shellter   schedule 09.10.2017awk
. - person Another.Chemist   schedule 09.10.2017