awk评估和计算与总和的比较

时间:2014-02-15 00:27:56

标签: loops awk count

我正试图找出用awk(不是很熟悉awk)解决这个问题的正确方法,但我似乎无法得到它。

基本上我有一个包含两列的文本文件。我想总结第二列,然后将第二列的每个条目除以总和,并在结果小于0.25时递增计数器。为了做到这一点,似乎我必须循环两次,一次得到总和,一次用总和来评估每个条目。我怎么能用一个班轮来解决这个问题呢?

Example Input:
0 5
1 5
2 10
3 5

Example Output:
3 (the sum is 25 and three of the entries result in a value less than 0.25 when divided by 25)

我试图在bash中尝试这样做,并意识到我需要使用awk来处理小数。我可以循环并得到总和并循环并对每个条目进行条件检查,但我不明白如何同时进行这两个。

2 个答案:

答案 0 :(得分:2)

未测试:

awk '
    { sum+=$2 ; row[NR]=$2 }
    END{ for(i=1;i<=NR;i++) if (row[i]/sum < 0.25) {counter+=1}; print counter }
' file

答案 1 :(得分:0)

使用awk

$ awk '{sum+=$2;a[NR]=$2}END{for (i in a) if (a[i]/sum<0.25) count++;print count}' file

解释

  • sum+=$2获取第2列的摘要并保存到sum
  • a[NR]=$2将第2列记录到数组a中(NR,行号,作为索引)
  • i in a逐个从数组a获取索引
  • if (a[i]/sum<0.25) count++使用条件(&lt; 0.25)
  • 进行计算和增加计数