or the decorate-sort-undecorate pattern. This will sort lines of format ...-{first,second,..,ninth} in the way a human would expect.
#!/bin/bash st() { I=1 exec sed " 1 { h s/.*/\ first$((I+=1))\ second$((I+=1))\ third$((I+=1))\ fourth$((I+=1))\ fifth$((I+=1))\ sixth$((I+=1))\ seventh$((I+=1))\ eighth$((I+=1))\ ninth$((I+=1))\ / x # clear it otherwise t fails for first line failed lookup t reset : reset } G s/^\\(.*-\\(.*\\)\\)\\n.*\\2\\([0-9]\\{1,\\}\\).*/\1 \3/ # branch to the end on success t # otherwise use a default value s/\\n.*$/ $((I))/ " } LIST=" alpha-third alpha-seventh alpha-first alpha-eighth" ORDERED_LIST=$( echo $LIST | tr ' ' '\n' | st | sort -k2,2n | awk '{print $1}') echo unordered: $LIST echo ordered: $ORDERED_LIST
No comments:
Post a Comment