forked from archan937/jsonv.sh
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathjsonv
More file actions
executable file
·129 lines (115 loc) · 2.85 KB
/
Copy pathjsonv
File metadata and controls
executable file
·129 lines (115 loc) · 2.85 KB
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/usr/bin/env bash
#
# jsonv 0.2.0
# A Bash command line tool for converting JSON to CSV
#
# Copyright (c) 2013 Paul Engel, released under the MIT license
# https://github.com/archan937/jsonv.sh
#
# Get a JSON file
#
# Example (e.g. example.json)
#
# [
# {
# "name": "Dagny Taggart",
# "id": 1,
# "age": 39
# }, {
# "name": "Francisco D'Anconia",
# "id": 8,
# "age": 40
# }, {
# "name": "Hank Rearden (a.k.a \"The Tank\")",
# "id": 12,
# "age": 46
# }
# ]
#
# Command line usage
#
# Call `jsonv` and pass the paths of the values used for the CSV columns (comma separated).
# Optionally, you can pass a prefix for the paths as a second argument.
#
# Example
#
# $ cat examples/simple.json | ./jsonv id,name,age
# 1,"Dagny Taggart",39
# 8,"Francisco D'Anconia",40
# 12,"Hank Rearden (a.k.a \"The Tank\")",46
#
# $ cat examples/simple.json | ./jsonv id,name,age > example.csv
# $ cat example.csv
# 1,"Dagny Taggart",39
# 8,"Francisco D'Anconia",40
# 12,"Hank Rearden (a.k.a \"The Tank\")",46
#
dir=$(cd `dirname $0` && pwd)
if [[ $dir =~ \/bin$ ]]; then
awk=$dir/.jsonv/json.awk
log=$dir/.jsonv/log
json=$dir/.jsonv/json
tokens=$dir/.jsonv/tokens
map=$dir/.jsonv/map
else
awk=$dir/utils/json.awk
log=$dir/tmp/log
json=$dir/tmp/json
tokens=$dir/tmp/tokens
map=$dir/tmp/map
fi
get_key () {
echo $1 | xargs | gawk -F. '{
for (i = 1; i <= NF; i++) {
if (i > 1) {
printf ",";
}
printf "\""$i"\"";
}
}'
}
echo_log () {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> $log
}
jsonv () {
echo_log "Writing JSON file"
cat /dev/stdin > $json
echo_log "Writing tokens file"
echo -e "$json\n" | gawk -f $awk > $tokens
echo_log "Deriving keys"
keys=()
for path in ${1//,/ }; do
keys+=($(get_key $path))
done
echo_log "Deriving prefix"
prefix=''
if [ "$2" != "" ]; then
prefix=$(get_key $2)","
fi
echo_log "Counting entries"
count=$(cat $tokens | sed 's/^[\["a-z,]*//g' | sed 's/,.*//g' | gawk '/^[0-9]+$/ && !_[$0]++' | gawk -F\t 'BEGIN{max==""} ($1 > max) {max=$1} END{print max}')
echo_log "Writing map file"
row=''
for key in "${keys[@]}"; do
row="$row[$prefix"INDEX",$key]\t"
done
echo -e $row | gawk -F\t -v n="$count" '{for(i=0;i<=n;i++) print}' | gawk -F\t '{gsub("INDEX",NR-1,$0); print $0}' > $map
echo_log "Deriving line format"
format=''
for ((i=1; i<=${#keys[@]}; i++)); do
if [ $i -gt 1 ]; then
format+='","'
fi
format+="a[\$"$i"]"
done
echo_log "Compiling CSV output"
program="'FNR==NR{a[\$1]=\$2; next} {print $format}'"
eval "gawk -F\\\t $program $tokens $map"
echo_log "Done."
echo "=====================" >> $log
}
if [[ "$1" == "-v" || "$1" == "--version" ]]; then
echo "0.2.0"
elif [ "$1" != "" ]; then
jsonv $1 $2
fi