如何在三列中操作间隔 table
How to manipultate intervals in a three column table
我有一个文件,其中一部分我在整理后发布在下面:
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 ,, } NR%5==0 {print ,,}'|awk {for (i=2; i<=$i ;i++) {a[i]=sqrt((p[i]*p[i])+($i*))} } { for(i=2; i<=$i ;i++) {p[i]=$i;} } /[0-9]/{ for (i in a) {printf "%s ",a[i]};print "";print "" }
但是我没有做我想做的事。有谁知道如何处理它?
不是最优化的解决方案,但应该可行。
sort -k1,1 -k2,2n -k3,3n < your_file_name | \
awk '{if(length(x1[])==0) x1[]=; x2[]=;\
if(length(y1[])==0) y1[]=; y2[]=;} END \
{for (i in x1) print i, sqrt((x2[i]-x1[i])^2+(y2[i]-y1[i])^2)}'
解释:
sort -k1,1 -k2,2n -k3,3n -- Sort data and numeric sort for column 2 and 3
if(length(x1[])==0) x1[]=; x2[]=;-- Use associate array to get first value for each area name
END -- Loop through all records
演示:
$sort -k1,1 -k2,2n -k3,3n < area.txt | awk '{if(length(x1[])==0) x1[]=; x2[]=;\
if(length(y1[])==0) y1[]=; y2[]=;} 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[])==0) x1[]=; x2[]=;\
if(length(y1[])==0) y1[]=; y2[]=;} 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
$
我有一个文件,其中一部分我在整理后发布在下面:
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 ,, } NR%5==0 {print ,,}'|awk {for (i=2; i<=$i ;i++) {a[i]=sqrt((p[i]*p[i])+($i*))} } { for(i=2; i<=$i ;i++) {p[i]=$i;} } /[0-9]/{ for (i in a) {printf "%s ",a[i]};print "";print "" }
但是我没有做我想做的事。有谁知道如何处理它?
不是最优化的解决方案,但应该可行。
sort -k1,1 -k2,2n -k3,3n < your_file_name | \
awk '{if(length(x1[])==0) x1[]=; x2[]=;\
if(length(y1[])==0) y1[]=; y2[]=;} END \
{for (i in x1) print i, sqrt((x2[i]-x1[i])^2+(y2[i]-y1[i])^2)}'
解释:
sort -k1,1 -k2,2n -k3,3n -- Sort data and numeric sort for column 2 and 3
if(length(x1[])==0) x1[]=; x2[]=;-- Use associate array to get first value for each area name
END -- Loop through all records
演示:
$sort -k1,1 -k2,2n -k3,3n < area.txt | awk '{if(length(x1[])==0) x1[]=; x2[]=;\
if(length(y1[])==0) y1[]=; y2[]=;} 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[])==0) x1[]=; x2[]=;\
if(length(y1[])==0) y1[]=; y2[]=;} 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
$