【问题标题】:rearrange the column and sum row wise [closed]重新排列列并按行求和[关闭]
【发布时间】:2021-03-20 04:08:19
【问题描述】:

我有一个单列文本文件,其中包含带有 > 分隔符的数据。我只是想重新排列数据并明智地求和。我希望一些专家能帮助我。在此先感谢。

输入

>
-5.274285562336444855e-03
-1.159460376948118210e-02
-1.162581238895654678e-02
>
1.672667078673839569e-02
2.755508385598659515e-02
4.910076968371868134e-04
>
1.891197753138840199e-03
-1.517401076853275299e-03
-3.349198959767818451e-03

输出应该是

-5.274285562336444855e-03 + 1.672667078673839569e-02 + 1.891197753138840199e-03
-1.159460376948118210e-02 + 2.755508385598659515e-02 + -1.517401076853275299e-03
-1.162581238895654678e-02 + 4.910076968371868134e-04 + -3.349198959767818451e-03 

【问题讨论】:

  • “输出应该是”标记的数据应该是预期的输出。
  • 不,先生,我需要行值的总和
  • 请将该示例输入的所需输出(无描述)添加到您的问题(无评论)。

标签: linux shell for-loop awk


【解决方案1】:

awk 中一个相对简单的方法是使用计数器n 连接数组中的值来协调记录输入,然后在END 规则中输出,例如

awk '$1==">" {n=1; next} {a[n]=a[n](a[n]?" + "$1:$1); sum[n]+=$1;n++} END {for(i=1;i<n;i++) print a[i]" = "sum[i]}' file

使用/输出示例

$ awk '$1==">" {n=1; next} {a[n]=a[n](a[n]?" + "$1:$1); sum[n]+=$1;n++} END {for(i=1;i<n;i++) print a[i]" = "sum[i]}' file
-5.274285562336444855e-03 + 1.672667078673839569e-02 + 1.891197753138840199e-03 = 0.0133436
-1.159460376948118210e-02 + 2.755508385598659515e-02 + -1.517401076853275299e-03 = 0.0144431
-1.162581238895654678e-02 + 4.910076968371868134e-04 + -3.349198959767818451e-03 = -0.014484

用空格代替'&gt;'

由于在您的评论中您更改了输入的格式,说明'&gt;' 实际上并没有出现在文件中并且您有空行(或带有单个空格的行 - 不清楚),您将需要将第一条规则的条件改为NF==0而不是$1=="&gt;",例如

$ awk 'NF==0 {n=1; next} {a[n]=a[n](a[n]?" + "$1:$1); sum[n]+=$1;n++} END {for(i=1;i<n;i++) print a[i]" = "sum[i]}' cols2
-5.274285562336444855e-03 + 1.672667078673839569e-02 + 1.891197753138840199e-03 = 0.0133436
-1.159460376948118210e-02 + 2.755508385598659515e-02 + -1.517401076853275299e-03 = 0.0144431
-1.162581238895654678e-02 + 4.910076968371868134e-04 + -3.349198959767818451e-03 = -0.014484

注意:不要就包含'&gt;'的文本寻求帮助,因为你的实际文本有' '。没有一般的方法会处理相同)

【讨论】:

  • 没有我还需要求和值不只是-5.274285562336444855e-03 + 1.672667078673839569e-02 + 1.891197753138840199e-03 -1.159460376948118210e-02 + 2.755508385598659515e-02 + -1.517401076853275299e-03 -1.162581238895654678e -02 + 4.91007696837186​​8134e-04 + -3.349198959767818451e-03
  • 如果我有空格而不是 > 将你的脚本工作。你能建议什么改变这种情况
  • 当我用空格“”替换 > 时它不起作用
  • (抱歉,预约了牙医),如果您只有space,请使用NF == 0 而不是$1=="&gt;"awk 不将空格视为字段的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 2020-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多