# 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](https://dyn.manpages.debian.org/jump?q=csvstat) or [xsv stats](https://dyn.manpages.debian.org/jump?q=xsv)

**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
```