如何在三列表格中处理区间

问题描述 投票:0回答:1

我有一个文件,排序后将其中一部分发布到下面:

area1   38896   39876
area1   39532   40521
area1   55975   56958
area1   73070   74098
area1   79689   79934
area2   43757   46798
area2   44055   47111
area2   54208   54354
area2   57000   59336
area2   69391   72882
area3   49621   50967
area3   49946   51322
area3   53044   53505
area3   65205   66473
area3   66888   68294

我的目标是通过为每个区域减去最后一组坐标减去第一个坐标,来使这些区域具有一个间隔。根据定义,笛卡尔系统中2点的内部是d= sqrt( (X2 –x1)^2 +(y2 –y1)^2 )。最初,我尝试使用bedtool查找解决方案,但没有发现与我的情况有关的任何内容。

我想要的输出:

d area1 =sqrt{ (79689 -38896) ^2 + (79934-39876) ^2}

d area2 =sqrt{ (69391-43757 ) ^2 + (72882-46798)^2}

我写此提示:

Cat myfile | sort -k1,1 -k2,2n |sort -V  |awk 'NR %5==1 {print $1,$2,$3 } NR%5==0 {print $1,$2,$3}'|awk {for (i=2; i<=$i ;i++) {a[i]=sqrt((p[i]*p[i])+($i*$1))}  } { for(i=2; i<=$i ;i++) {p[i]=$i;}  }  /[0-9]/{ for (i in a) {printf "%s ",a[i]};print "";print "" } 

但是我没有做自己想做的事。有谁知道如何处理吗?

awk command
1个回答
1
投票
sort -k1,1 -k2,2n -k3,3n -- Sort data and numeric sort for column 2 and 3 if(length(x1[$1])==0) x1[$1]=$2; x2[$1]=$2;-- Use associate array to get first value for each area name END -- Loop through all records

Demo:

$sort -k1,1 -k2,2n -k3,3n < area.txt | awk '{if(length(x1[$1])==0) x1[$1]=$2; x2[$1]=$2;\
if(length(y1[$1])==0) y1[$1]=$3; y2[$1]=$3;} END \
{for (i in x1) print i, sqrt((x2[i]-x1[i])^2+(y2[i]-y1[i])^2)}'
area1 57172.7
area2 36571.5
area3 24461.7
$cat area.txt 
area1 38896 39876
area1 39532 40521
area1 55975 56958
area1 73070 74098
area1 79689 79934
area2 43757 46798
area2 44055 47111
area2 54208 54354
area2 57000 59336
area2 69391 72882
area3 49621 50967
area3 49946 51322
area3 53044 53505
area3 65205 66473
area3 66888 68294
$

$sort -k1,1 -k2,2n -k3,3n < area.txt | awk '{if(length(x1[$1])==0) x1[$1]=$2; x2[$1]=$2;\
if(length(y1[$1])==0) y1[$1]=$3; y2[$1]=$3;} END \
{for (i in x1) print i, x2[i], x1[i], y2[i], y1[i]}'
area1 79689 38896 79934 39876
area2 69391 43757 72882 46798
area3 66888 49621 68294 50967
$

© www.soinside.com 2019 - 2024. All rights reserved.