awk - 添加字段的数字
问题描述
我有一个包含多行和两列或四列的文本文件。如果有两列,则第一列是 id,第二列是数字,如果四列第一和第二列是 id,第三和第四列是数字。对于四列行,第 2 列和第 4 列单元格可以有多个条目,以逗号分隔。如果只有两列,我想按原样打印它们;但是如果有四列,我只想打印第一列 id,而在第二列中,我想要该行的第三列和第四列中存在的所有数字的总和。
输入
CG AT,AA,CA 17 1,1,1
GT 14
TB AC,TC,TA,GG,TT,AR,NN,NM,AB,AT,TT,TC,CA,BB,GT,AT,XT,MT,NA,TT 552 6,1,1,2,2,1,2,1,5,3,4,1,2,1,1,1,3,4,5,4
TT CG,GT,TA,GB 105 3,4,1,3
预期产出
CG 20
GT 14
TB 602
TT 116
解决方案
如果实际文件中没有前导空格,请$1
使用$2
.
$ awk -F '[ ,]+' '{for(i=1; i<=NF; i++) s+=$i; print $2, s; s=0}' <<EOF
CG AT,AA,CA 17 1,1,1
GT 14
TB AC,TC,TA,GG,TT,AR,NN,NM,AB,AT,TT,TC,CA,BB,GT,AT,XT,MT,NA,TT 552 6,1,1,2,2,1,2,1,5,3,4,1,2,1,1,1,3,4,5,4
TT CG,GT,TA,GB 105 3,4,1,3
EOF
CG 20
GT 14
TB 602
TT 116
-F '[ ,]+'
表示“字段由一个或多个空格或逗号分隔”。没有与 相关的条件
{action}
,因此它将在每一行上执行。NF
是字段数,$X
指的是第 X 个字段。字符串等于 0,所以我们可以简单地将每个字段相加得到一个总和。
在我们打印第一个非空白字段和我们的总和后,我们重置下一行的总和。
推荐阅读
- ios - Agora iOS 视频未在网页上显示
- c - (int)0 是否与 '==' 的空指针相同?
- php - 使用消息无效块类型获取 Mage_Core_Exception:Mage_Zeon_Manufacturer_Block_Home
- asp.net - 应用 Razorpay 支付网关无法获取表单响应 asp.net 4.7.2
- python - Python程序实现反幻方
- python - 理解分类报告:与混淆矩阵的差异
- c# - MassTransit,除非消息在公共库中,否则不会激活消费者
- python - 使用多索引重新索引并创建空日期
- imagemagick - 居中右对齐文本的框
- python - 根据索引和值修改numpy数组中的值