1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
#! /bin/bash
# -s to skip specify columns of longitude and latitude
for i in "$@"
do
case $i in
-s)
lon_col=0; lat_col=1
shift;;
*)
csv=$i
shift;;
esac
done
# if no -s option, just read from input
if [ "$lon_col" != "0" ]; then
# show each field with index in csv
echo -------------- > /dev/tty
head -1 < $csv | tr ',' '\n' | nl > /dev/tty
echo -------------- > /dev/tty
echo > /dev/tty
# get index of lon/lat column
read -p "Number of longitude column: " lon_col
read -p "Number of latitude column: " lat_col
fi
(which dos2unix &>/dev/null && dos2unix <$csv || cat $csv) |\
# move lon and lat to the first and second column
awk -F',' -v lon_th=$lon_col -v lat_th=$lat_col '\
BEGIN{OFS=","}\
{printf $lon_th "," $lat_th; for (i=1; i<= NF; i++) if (i != lat_th && i != lon_th) printf "," $i; print ""}\
' |\
# change csv into array format, like [lon, lat, "field1", field2...]
sed 's/[^,]*/"\0"/g; s/.*/[\0]/g' |\
# wrap other fields as a json object, like [lon, lat, {...}]
jq -s '.[0][2:] as $fields | .[1:][] | [.[0], .[1], ([$fields, .[2:]] | transpose | map({(.[0]): .[1]}) | add)]' |\
# create array of geojson point features
jq '{"type": "Feature", "properties": .[2], "geometry":{ "type": "Point", "coordinates": [(.[0] | tonumber), (.[1] | tonumber)] } }' |\
# wrap features as geojson format
jq -s '{"type": "FeatureCollection", "features": .}' |\
tee /tmp/geojson
echo stored into /tmp/geojson > /dev/tty
|