September 2017 Update
This commit is contained in:
parent
bba7bfd280
commit
ba8067c3b7
14570 changed files with 153136 additions and 63871 deletions
58
Task/Natural-sorting/Jq/natural-sorting-1.jq
Normal file
58
Task/Natural-sorting/Jq/natural-sorting-1.jq
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
def splitup:
|
||||
def tidy: if .[0] == "" then .[1:] else . end | if .[length-1] == "" then .[0:length-1] else . end ;
|
||||
|
||||
# a and b are assumed to be arrays:
|
||||
def alternate(a;b):
|
||||
reduce range(0; [a,b] | map(length) | max) as $i ([]; . + [a[$i], b[$i]]);
|
||||
|
||||
([splits("[0-9]+")] | tidy) as $a
|
||||
| ([splits("[^0-9]+")] | tidy | map(tonumber)) as $n
|
||||
| (test("^[0-9]")) as $nfirst
|
||||
| if $nfirst then alternate($n; $a) else alternate($a; $n) end ;
|
||||
|
||||
# The following implementation of tr is more general than needed here, but the generality
|
||||
# makes for adaptability.
|
||||
# x and y should both be strings defining a character-by-character translation, like Unix/Linux "tr".
|
||||
# if y is shorter than x, then y will in effect be padded with y's last character.
|
||||
# The input may be a string or an exploded string (i.e. an array);
|
||||
# the output will have the same type as the input.
|
||||
def tr(x;y):
|
||||
type as $type
|
||||
| (x | explode) as $xe
|
||||
| (y | explode) as $ye
|
||||
| $ye[-1] as $last
|
||||
| if $type == "string" then explode else . end
|
||||
| map( . as $n | ($xe|index($n)) as $i | if $i then $ye[$i]//$last else . end)
|
||||
| if $type == "string" then implode else . end;
|
||||
|
||||
# NOTE: the order in which the filters are applied is consequential!
|
||||
def natural_sort:
|
||||
def naturally:
|
||||
gsub("\\p{M}"; "") # combining characters (accents, umlauts, enclosures, etc)
|
||||
| tr("ÀÁÂÃÄÅàáâãäåÇçÈÉÊËèéêëÌÍÎÏìíîïÒÓÔÕÖØòóôõöøÑñÙÚÛÜùúûüÝÿý";
|
||||
"AAAAAAaaaaaaCcEEEEeeeeIIIIiiiiOOOOOOooooooNnUUUUuuuuYyy")
|
||||
# Ligatures:
|
||||
| gsub("Æ"; "AE")
|
||||
| gsub("æ"; "ae")
|
||||
| gsub("\u0132"; "IJ") # IJ
|
||||
| gsub("\u0133"; "ij") # ij
|
||||
| gsub("\u0152"; "Oe") # Œ
|
||||
| gsub("\u0153"; "oe") # œ
|
||||
| gsub("ffl"; "ffl")
|
||||
| gsub("ffi"; "ffi")
|
||||
| gsub("fi" ; "fi")
|
||||
| gsub("ff" ; "ff")
|
||||
| gsub("fl" ; "fl")
|
||||
# Illustrative replacements:
|
||||
| gsub("ß" ; "ss") # German scharfes S
|
||||
| gsub("ſ|ʒ"; "s") # LATIN SMALL LETTER LONG S and LATIN SMALL LETTER EZH
|
||||
|
||||
| ascii_downcase
|
||||
| gsub("\\p{Cc}+";" ") # control characters
|
||||
| gsub("^(the|a|an) "; "") # leading the/a/an (as words)
|
||||
| gsub("\\s+"; " ") # whitespace
|
||||
| sub("^ *";"") # leading whitespace
|
||||
| sub(" *$";"") # trailing whitespace
|
||||
| splitup # embedded integers
|
||||
;
|
||||
sort_by(naturally);
|
||||
1
Task/Natural-sorting/Jq/natural-sorting-2.jq
Normal file
1
Task/Natural-sorting/Jq/natural-sorting-2.jq
Normal file
|
|
@ -0,0 +1 @@
|
|||
if type == "string" then "", . else natural_sort end
|
||||
51
Task/Natural-sorting/Jq/natural-sorting-3.jq
Normal file
51
Task/Natural-sorting/Jq/natural-sorting-3.jq
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
jq -r -f Natural_sorting.jq Natural_sorting.json
|
||||
|
||||
# Ignoring leading spaces
|
||||
[
|
||||
" ignore leading spaces: 2+0",
|
||||
" ignore leading spaces: 2+1",
|
||||
" ignore leading spaces: 2-1",
|
||||
"ignore leading spaces: 2-2"
|
||||
]
|
||||
|
||||
# Ignoring multiple adjacent spaces (m.a.s)
|
||||
[
|
||||
"ignore m.a.s spaces: 2+0",
|
||||
"ignore m.a.s spaces: 2+1",
|
||||
"ignore m.a.s spaces: 2-1",
|
||||
"ignore m.a.s spaces: 2-2"
|
||||
]
|
||||
|
||||
# Equivalent whitespace characters
|
||||
[
|
||||
"Equiv.\u000bspaces: 3+0",
|
||||
"Equiv.\nspaces: 3+1",
|
||||
"Equiv.\tspaces: 3+2",
|
||||
"Equiv.\fspaces: 3-1",
|
||||
"Equiv.\rspaces: 3-2",
|
||||
"Equiv. spaces: 3-3"
|
||||
]
|
||||
|
||||
# Case Indepenent sort
|
||||
[
|
||||
"casE INDEPENENT: 3+0",
|
||||
"case INDEPENENT: 3+1",
|
||||
"caSE INDEPENENT: 3-1",
|
||||
"cASE INDEPENENT: 3-2"
|
||||
]
|
||||
|
||||
# Numeric fields as numerics
|
||||
[
|
||||
"foo100bar10baz0.txt",
|
||||
"foo100bar99baz0.txt",
|
||||
"foo1000bar99baz9.txt",
|
||||
"foo1000bar99baz10.txt"
|
||||
]
|
||||
|
||||
# Title sorts
|
||||
[
|
||||
"The 39 steps",
|
||||
"The 40th step more",
|
||||
"Wanda",
|
||||
"The Wind in the Willows"
|
||||
]
|
||||
Loading…
Add table
Add a link
Reference in a new issue