commit c2b181b

uint  ·  2026-08-26 15:34:38 +0000 UTC
parent 0db71b5
sh: speed up json parsing
1 files changed,  +25, -7
+25, -7
 1@@ -114,15 +114,33 @@ http_get()
 2 parse_library_json()
 3 {
 4 	LC_ALL=C awk '
 5+	BEGIN {
 6+		FS = "},\\{"
 7+	}
 8+
 9 	{
10-		s = $0
11-		while (match(s, /"id":"([^"]+)","path":"([^"]*)"/)) {
12-			chunk = substr(s, RSTART, RLENGTH)
13-			id = chunk; sub(/^"id":"/, "", id); sub(/","path":"[^"]*"$/, "", id)
14-			path = chunk; sub(/^"id":"[^"]+","path":"/, "", path); sub(/"$/, "", path)
15-			gsub(/\\"/, "\"", path); gsub(/\\t/, "\t", path); gsub(/\\r/, "", path); gsub(/\\n/, "", path)
16+		for (i = 1; i <= NF; i++) {
17+			chunk = $i
18+
19+			sub(/^\[\{/, "", chunk)
20+			sub(/^\{/, "", chunk)
21+			sub(/\}\]$/, "", chunk)
22+			sub(/\}$/, "", chunk)
23+
24+			id = chunk
25+			sub(/^"id":"/, "", id)
26+			sub(/","path":".*$/, "", id)
27+
28+			path = chunk
29+			sub(/^"id":"[^"]+","path":"/, "", path)
30+			sub(/"$/, "", path)
31+
32+			gsub(/\\"/, "\"", path)
33+			gsub(/\\t/, "\t", path)
34+			gsub(/\\r/, "", path)
35+			gsub(/\\n/, "", path)
36+
37 			printf "%s\t%s\n", id, path
38-			s = substr(s, RSTART + RLENGTH)
39 		}
40 	}
41 	' "$1"