首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找列和,除以列值,然后使用awk打印到新列。

查找列和,除以列值,然后使用awk打印到新列。
EN

Stack Overflow用户
提问于 2019-07-29 21:26:11
回答 2查看 988关注 0票数 2

我的数据是这样的:

代码语言:javascript
复制
file Gibbs kcal rel pop pop2
RR2.out -1752.142111    -1099486.696073  0.000000 -0.0000 1.0000
RR1.out -1752.141887    -1099486.555511  0.140562 -0.2374 0.7891
RR4.out -1752.140564    -1099485.725315  0.970758 -1.6398 0.1947
RR3.out -1752.140319    -1099485.571575  1.124498 -1.8995 0.1502
RR5.out -1752.138532    -1099484.450215  2.245858 -3.7937 0.0227
RR6.out -1752.138493    -1099484.425742  2.270331 -3.8351 0.0218

我想找出第6栏的和,然后将第6栏中的每个值除以该和,然后在一个名为“加权”的新列中打印这些值。

使用

代码语言:javascript
复制
 echo "weighted" >> allRE7
 awk 'NR==FNR{sum+= $6; next}{printf("%0.4f\n", $6/sum)}' input input >> out
 paste input out >> final

给我

代码语言:javascript
复制
 file Gibbs kcal rel pop pop2   weighted
 RR2.out    -1752.142111    -1099486.696073  0.000000 -0.0000 1.0000    0.0000
 RR1.out    -1752.141887    -1099486.555511  0.140562 -0.2374 0.7891    0.4590
 RR4.out    -1752.140564    -1099485.725315  0.970758 -1.6398 0.1947    0.3622
 RR3.out    -1752.140319    -1099485.571575  1.124498 -1.8995 0.1502    0.0894
 RR5.out    -1752.138532    -1099484.450215  2.245858 -3.7937 0.0227    0.0689
 RR6.out    -1752.138493    -1099484.425742  2.270331 -3.8351 0.0218    0.0104
         0.0100

我不知道0.0100是从哪里来的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-29 21:42:35

问题是,awk代码被打印为标题行的加权结果。为消除这一现象,请取代:

代码语言:javascript
复制
awk 'NR==FNR{sum+= $6; next}{printf("%0.4f\n", $6/sum)}' input input >> out

通过以下方式:

代码语言:javascript
复制
awk 'NR==FNR{sum+= $6; next} FNR>1{printf("%0.4f\n", $6/sum)}' input input >> out

FNR>1条件确保只为数据行打印$6/sum

改进

echopaste命令是不必要的。尝试:

代码语言:javascript
复制
$ awk 'NR==FNR{sum+= $6; next} FNR==1{print $0,"weighted"; next} {printf("%s %0.4f\n",$0,$6/sum)}' input input
file Gibbs kcal rel pop pop2 weighted
RR2.out -1752.142111    -1099486.696073  0.000000 -0.0000 1.0000 0.4590
RR1.out -1752.141887    -1099486.555511  0.140562 -0.2374 0.7891 0.3622
RR4.out -1752.140564    -1099485.725315  0.970758 -1.6398 0.1947 0.0894
RR3.out -1752.140319    -1099485.571575  1.124498 -1.8995 0.1502 0.0689
RR5.out -1752.138532    -1099484.450215  2.245858 -3.7937 0.0227 0.0104
RR6.out -1752.138493    -1099484.425742  2.270331 -3.8351 0.0218 0.0100

上面的变体使用了一个三元运算符(hat技巧:Ed Morton),:

代码语言:javascript
复制
$ awk 'NR==FNR{sum+= $6; next} {print $0, (FNR>1 ? sprintf("%0.4f",$6/sum) : "weighted")}' input input
file Gibbs kcal rel pop pop2 weighted
RR2.out -1752.142111    -1099486.696073  0.000000 -0.0000 1.0000 0.4590
RR1.out -1752.141887    -1099486.555511  0.140562 -0.2374 0.7891 0.3622
RR4.out -1752.140564    -1099485.725315  0.970758 -1.6398 0.1947 0.0894
RR3.out -1752.140319    -1099485.571575  1.124498 -1.8995 0.1502 0.0689
RR5.out -1752.138532    -1099484.450215  2.245858 -3.7937 0.0227 0.0104
RR6.out -1752.138493    -1099484.425742  2.270331 -3.8351 0.0218 0.0100
票数 1
EN

Stack Overflow用户

发布于 2019-07-29 21:49:20

你也在计算标题线的平均值。

要省略标题行,您的awk脚本应该是:

代码语言:javascript
复制
awk 'FNR==1{next}NR==FNR{sum+= $6; next}{printf("%0.4f\n", $6/sum)}' input input >> out
paste input out >> final 

一个更干净的awk脚本(包括paste命令)是:

代码语言:javascript
复制
awk 'FNR==1{next}NR==FNR{sum+= $6; next}{printf("%s %0.4f\n", $0, $6/sum)}' input input
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57261625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档