【问题标题】:Add consecutive entries in a column在列中添加连续条目
【发布时间】:2014-07-11 06:05:13
【问题描述】:

我有一个格式如下的文件

   0.99987799      17743.000    
   1.9996300       75.000000    
   2.9993899       75.000000    
   3.9991500       102.00000    
   4.9988999       131.00000    
   5.9986601       130.00000    
   6.9984102       152.00000    
   7.9981699       211.00000    
   8.9979200       256.00000    
   9.9976797       259.00000    
   10.997400       341.00000    
   11.997200       373.00000

我想做的是在第二列中添加数据,每四行。所以期望的输出是

1 17743+75+75+102
2 131+130+52+211
3 256+259+341+373

如何在 awk 中做到这一点?

我知道我可以使用

在文件中找到特定元素
awk 'FNR == 5 {print $2}' file

但我不知道如何连续添加 4 个元素。例如,如果我尝试

awk '$2 {print FNR == 5}' file

我只得到零,所以我不知道如何先解析列然后解析行。我也试过了

awk 'BEGIN{i=4}
{
 for (NR>=1 || NR<=i)
{
print $2
}
}' filename

但我在NR&lt;=i 收到语法错误。我也不知道如何循环整个文件。任何帮助或想法都会受到欢迎!或者在C++ 中做这件事会更好吗?不知道哪个更方便……

我也试过

awk 'BEGIN{sum=0} {{sum += $2} if(FNR%4 == 0) { print sum; sum=0}}' infile.dat

但它似乎无法正常工作......

【问题讨论】:

  • 你能展示一下你到目前为止得到了什么吗?
  • @fedorqui:非常感谢您的评论!我已经更新了我的问题!
  • @miltonb :几个小时以来,我一直在尝试寻找一些东西,但我不知道如何继续。任何帮助都非常受欢迎!
  • 我会尝试这样的事情:在 BEGIN 创建累加器sum=0,为每一行添加sum += $2,然后如果是每第四行打印结果并重新初始化累加器:if(FNR%4 == 0) { print sum; sum=0} .在 END 你可以检查最后四个是否完成,如果没有打印剩余的部分sum
  • @CiaPan :非常感谢您的评论!它似乎无法正常工作。也许我做错了什么。请检查我编辑的问题!

标签: c++ awk sed grep gawk


【解决方案1】:
awk 'NR%4==1{sum=$2; next}{sum+=$2} NR%4==0{print ++j,sum;}' input.txt

输出:

1 17995
2 624
3 1229

对于组的第一个数字,它将第二列的值存储在$2 中,接下来的 3 行将第二列的值和sum 相加。对于组的最后一行 NR%4==0 打印结果。

如果您不需要求和结果之前的行号,只需删除 ++j,

【讨论】:

  • 非常感谢您的回答!它工作正常!不过,我有点困惑……NR%4 是做什么的?我知道 NR 是行数,但 % 是做什么的?
  • @Thanos,不客气,很高兴它有所帮助。 % 是余数运算符。
【解决方案2】:
awk '{print $2}' file | paste -d+ - - - - | bc

【讨论】:

  • 非常感谢您的回答!我不明白你的代码!可能 4 的因子来自 4 个破折号,但我不确定...
  • @Thanos: awk 打印第二个列项; paste 以四个为一组复制它们,在它们之间插入加号,因此它产生了加法表达式;最后bc 计算这些表达式并输出它们的值。
【解决方案3】:

这对我来说很好用:

awk '{sum += $2}
FNR%4==0 {print FNR/4, sum; sum = 0}
END {if(FNR%4){print int(FNR/4)+1, sum}}' awktest.txt

结果为:

1 17995
2 624
3 1229

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 2015-07-01
    • 2019-11-01
    • 2011-09-01
    • 1970-01-01
    • 2020-10-29
    相关资源
    最近更新 更多