2014-11-25 61 views
0

我有一个包含类似下面的文本文件:Shell脚本添加列的值

{"userId":"f1fcab","count":"3","type":"Stack"} 
{"userId":"fcab","count":"2","type":"Stack"} 
{"userId":"abcd","count":"5","type":"Stack"} 

我想计数的值的总和。
我使用awk来实现这一目标如下图所示:

$ awk -F "," '{print $4}' test.txt  

如何用awk我只得到了整数类型,并添加他们。

我的脚本应该给我的

sum=10 
+0

'AWK“匹配($ 0, “计数\”:\ “([^ \”]) “一个){X + = A [1]} END {打印” 总和=“x}'file' – 2014-11-25 13:08:21

回答

1

假设统一使用双引号,你可以使用:

awk -F\" '{s += $8} END{print "sum=" s+0}' inputFile 

这将产生:

sum=10 

这工作,因为报价分隔符为您提供了以下字段:

1 2  3 4  5 6  7 8 ... 
{"userId":"f1fcab","count":"3","type":"Stack"} 
2

你可以试试下面,

$ awk -F'"' '{sum = sum + $8;}END{print "sum="sum+0}' file 
sum=10 
  • -F'"'设置双引号FS值。 Awk根据变量FS的值将行分割成柱状。
  • sum = sum + $8计算在列中没有8中的所有值的总和,并将其存储到一个名为sum
  • 可变最后通过打印变量sum在端会给你所需的输出。
+0

Thanks Avinash..What使用$ 8 – Aman 2014-11-25 13:12:09

+0

@Aman我想,我解释过。 – 2014-11-25 13:12:50

+1

请注意,您可以说'sum + = $ 8'而不是'sum = sum + $ 8'。有时候打印'sum + 0',所以如果'sum'没有设置,你会得到一个0. – fedorqui 2014-11-25 13:13:33

2

您可以得到的值使用密钥双引号(")作为分隔符,从而将第八列的值将是到count上:

$ awk -F"\"" 'BEGIN {sum=0} {sum+=$8} END {print sum}' fd 
10 
+0

只是一个建议,'''是一个_double_报价。 – paxdiablo 2014-11-25 13:17:27

+0

错过了“double”,谢谢 – 2014-11-25 13:18:14

+1

'BEGIN'块不需要,因为'sum'在开始时什么都没有,也不需要声明。 :'awk -F \''{sum + = $ 8} END {print sum}''。然后它会和paxdiablo发布一样。 – Jotne 2014-11-25 13:29:25

1
awk -F'[:"]' '{sum+=$10} END{print "sum=" sum}' File 

设置':'“'作为分隔符。然后取第10个字段,这是计数值。然后添加总和和结束打印。

实施例:

[email protected]:~/AMD_C/SO$ cat File 
{"userId":"f1fcab","count":"3","type":"Stack"} 
{"userId":"fcab","count":"2","type":"Stack"} 
{"userId":"abcd","count":"5","type":"Stack"} 
[email protected]:~/AMD_C/SO$ awk -F'[:"]' '{sum+=$10} END{print "sum=" sum}' File 
sum=10