awk - 计算连续点的距离

标签 awk

我需要帮助! 我有几点 ABCDEF... 位置如下:

A  0.00  0.50  0.10
B  1.00  2.50  2.00
C  0.70  0.88  1.29
D  2.13  2.90  0.11
E  1.99  0.77  0.69
...

我的目标是计算 AB、BC、CD、EF... 的距离以及它们的总和,输出形式如下:

sum_distance(AB)
sum_distance(AB+BC)
sum_distance(AB+BC+CD)
sum_distance(AB+BC+CD+DE)
sum_distance(AB+BC+CD+DE+EF)
.... 

我在互联网上发现 awk 可以做到并适用于我的情况。但是,屏幕上没有输出任何结果或错误。你能帮我解决这个问题吗?

bash 外壳,awk

awk 'FNR==NR { a[NR]=$0; next } { for (i=FNR+1;i<=NR-1;i++) {split(a[i],b); print $1 "-" b[1], sqrt(($2-b[2])^2 + ($3-b[3])^2 + ($4-b[4])^2) | "column -t" } NR--}'

输出:

2.934280150
4.728297987
7.470140434
9.682130488
11.92469598
......

最佳答案

对于这项琐碎的任务,您不需要如此复杂的脚本。试试这个:

awk 'NR>1{ printf "%.9f\n",s+=sqrt(($2-x)^2+($3-y)^2+($4-z)^2) }
{ x=$2;y=$3;z=$4 }' file

对于除A 之外的所有点,计算距离,将其添加到总和s 并打印总和。对于所有点,将坐标保存在 x, y, z 中以供下一次计算。它的输出与 gawk 类似:

2.934280150
4.728297987
7.470140434
9.682130488

关于awk - 计算连续点的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55412201/

相关文章:

awk - 删除文件中出现的所有内容

unix - 如何用AWK删除部分重复行?

awk - 如何将第一个 POSIX `[:cntrl:]` 字符与旧 BSD `awk` 匹配?

regex - 寻求引用以了解一种模式 “!_[$0]++”

awk - 这个 awk 命令是如何工作的?

linux - Apache 日志 grep、awk 或 sed

linux - 根据字典替换文本

LINUX AWK命令合并基因亚型

unix - 无法构建数组并在 AWK 中打印出来

shell - shell脚本中如何获取包含关键字的段落?