gpt4 book ai didi

awk - 合并系列并识别它的结尾 - AWK

转载 作者:行者123 更新时间:2023-12-04 14:32:26 33 4
gpt4 key购买 nike

你能帮我按 $2 列中的坐标合并行吗?有一系列坐标以一个为单位增长。我想输出 f.e. :第 1 行合并到第 4 行 9079811-9079814,之后没有系列,因此将其合并到另一行等。对于输入中的第 3 列,我想计算平均值。

我写了一些脚本,但是这个脚本合并了从第一个坐标到最后一个坐标的所有行。无条件系列。

 awk -F'\t' -v OFS="\t" '{print $2,$4,$3,$1}' input | awk '!x[$2]{x[$2]=$1}y[$2]<$1{y[$2]=$1;}x[$2]>$1{x[$2]=$1} {sum+=$3} END{for(i in y)print $1,x[i],y[i],sum/NR,i}' | sort -V -k1,1 > output

输入:

chr12   9079811 29  A2M
chr12 9079812 29 A2M
chr12 9079813 29 A2M
chr12 9079814 28 A2M
chr12 9091202 5 A2M
chr12 9091203 5 A2M
chr12 9091204 5 A2M
chr12 9091390 15 A2M
chr12 9091391 15 A2M
chr12 9091392 13 A2M

输出:

chr12  9079811  9079814 28.75 A2M
chr12 9091202 9091204 5 A2M
chr12 9091390 9091392 14.3 A2M

最佳答案

Awk解决方案:

awk 's{ 
if ($2-prev == 1) { sum += $3; c++; prev=$2 }
else { print $1, s, prev, sum/c, $4; s=sum=c=0 }
}
!s{ s=prev=$2; sum=$3; c++ }
END{ print $1, s, prev, sum/c, $4 }' file
  • s - 指向主动处理系列的变量;包含系列的起始元素(例如 9079811)
  • prev - 保存已处理系列的每个先前项目

输出:

chr12 9079811 9079814 28.75 A2M
chr12 9091202 9091204 5 A2M
chr12 9091390 9091392 14.3333 A2M

关于awk - 合并系列并识别它的结尾 - AWK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48458008/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com