linux – 2d直方图制作
发布时间:2020-12-13 23:02:27 所属栏目:Linux 来源:网络整理
导读:我有一个包含两列的数据文件,比如 1.1 2.23.1 4.51.2 4.53.2 4.61.1 2.34.2 4.94.2 1.1 我想从两列做一个直方图,即得到这个输出(如果步长(或者我们在谈论直方图时的bin大小)等于0.1) 1.0 1.0 01.0 1.1 01.0 1.2 0...1.1 1.0 01.1 1.1 01.1 1.2 0...1.1 2.0 0
我有一个包含两列的数据文件,比如
1.1 2.2 3.1 4.5 1.2 4.5 3.2 4.6 1.1 2.3 4.2 4.9 4.2 1.1 我想从两列做一个直方图,即得到这个输出(如果步长(或者我们在谈论直方图时的bin大小)等于0.1) 1.0 1.0 0 1.0 1.1 0 1.0 1.2 0 ... 1.1 1.0 0 1.1 1.1 0 1.1 1.2 0 ... 1.1 2.0 0 1.1 2.1 0 1.1 2.2 1 ... ... 有人可以给我一些建议吗?如果我可以设置colmuns的值范围,那就太好了.在上述情况下,第1列值从1到4,与第2列相同. 已编辑:已更新以处理更多常规数据输入,例如浮点数.上述情况下的步长为0.1,但如果它可以为其他设置调谐,即如果步长范围(箱尺寸)例如是0.2或1.0,则会很好. 1.1 1.8 2.5 2.6 1.4 2.1 1.3 1.5 3.3 4.0 3.8 3.9 4.0 3.2 4.0 4.0 输出(如果bin大小= 1.0) 1 1 2 1 2 1 1 3 0 1 4 0 2 1 0 2 2 1 2 3 0 2 4 0 3 1 0 3 2 0 3 3 1 3 4 1 4 1 0 4 2 0 4 3 1 4 4 1 解决方法awk 'END { for (i = 0; ++i <= l;) { for (j = 0; ++j <= l;) printf "%d %d %d %sn",i,j, b[i,j],(j < l ? x : ORS) } } { f[NR] = $1; s[NR] = $2 b[$1,$2]++ }' l=4 infile 您可以试试这个(未经过全面测试): awk -v l=4 -v bs=0.1 'BEGIN { if (!bs) { print "invalid bin size" > "/dev/stderr" exit } split(bs,t,".") t[2] || fl++ m = "%." length(t[2]) "f" } { fk = fl ? int($1) : sprintf(m,$1) sk = fl ? int($2) : sprintf(m,$2) f[fk]; s[sk]; b[fk,sk]++ } END { if (!bs) exit 1 for (i = 1; int(i) <= l; i += bs) { for (j = 1; int(j) <= l; j += bs) { if (fl) { fk = int(i); sk = int(j); m = "%d" } else { fk = sprintf(m,i); sk = sprintf(m,j) } printf "%s" m OFS m OFS "%dn",(i > 1 && fk != p ? ORS : x),fk,sk,b[fk,sk] p = fk } } }' infile (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |