Skip to main content
1 of 8

Pretend it's a CSV and use CSV tools

The common CSV toolkits "csvkit" and "xsv" include some basic statistics features.

So if your data is formatted like so...

$ echo mynumbers 1 2 3 4 | tr " " "\n" mynumbers 1 2 3 4 

...then you can pretend that is a CSV file and use csvstat or xsv stats

Using csvstat

$ echo mynumbers 1 2 3 4 | tr " " "\n" | csvstat /usr/lib/python2.7/site-packages/agate/table/from_csv.py:74: RuntimeWarning: Error sniffing CSV dialect: Could not determine delimiter 1. "mynumbers" Type of data: Number Contains null values: False Unique values: 4 Smallest value: 1 Largest value: 4 Sum: 10 Mean: 2.5 Median: 2.5 StDev: 1.291 Most common values: 1 (1x) 2 (1x) 3 (1x) 4 (1x) Row count: 4 

Using xsv stats

$ echo mynumbers 1 2 3 4 | tr " " "\n" | xsv stats field,type,sum,min,max,min_length,max_length,mean,stddev mynumbers,Integer,10,1,4,1,1,2.5,1.118033988749895 

Or if you want this more readable

$ echo mynumbers 1 2 3 4 | tr " " "\n" | xsv stats | xsv table field type sum min max min_length max_length mean stddev mynumbers Integer 10 1 4 1 1 2.5 1.118033988749895 

Same things but without headers:

csvstat:

$ echo mynumbers 1 2 3 4 | tr " " "\n" | csvstat --no-header-row /usr/lib/python2.7/site-packages/agate/table/from_csv.py:74: RuntimeWarning: Error sniffing CSV dialect: Could not determine delimiter 1. "a" Type of data: Text Contains null values: False Unique values: 5 Longest value: 9 characters Most common values: 1 (1x) 3 (1x) 2 (1x) mynumbers (1x) 4 (1x) Row count: 5 

xsv:

$ echo 1 2 3 4 | tr " " "\n" | xsv stats --no-headers field,type,sum,min,max,min_length,max_length,mean,stddev 0,Integer,10,1,4,1,1,2.5,1.118033988749895 $ echo 1 2 3 4 | tr " " "\n" | xsv stats --no-headers | xsv table field type sum min max min_length max_length mean stddev 0 Integer 10 1 4 1 1 2.5 1.118033988749895