parent
cd6f70d1fe
commit
be54bf3e7d
@ -0,0 +1,2 @@ |
||||
sort |
||||
sort.exe |
||||
@ -0,0 +1,4 @@ |
||||
|
||||
|
||||
build: |
||||
go build .
|
||||
@ -0,0 +1,3 @@ |
||||
module lcthw.dev/go/go-coreutils/sort |
||||
|
||||
go 1.25.3 |
||||
@ -0,0 +1,66 @@ |
||||
package main |
||||
|
||||
import ( |
||||
"fmt" |
||||
"bufio" |
||||
"os" |
||||
"slices" |
||||
"flag" |
||||
"strings" |
||||
"strconv" |
||||
) |
||||
|
||||
type Opts struct { |
||||
IgnoreCase bool |
||||
Numeric bool |
||||
} |
||||
|
||||
func parse_opts() Opts { |
||||
var opts Opts |
||||
|
||||
flag.BoolVar(&opts.IgnoreCase, "f", false, "ignore case") |
||||
flag.BoolVar(&opts.Numeric, "n", false, "numeric sort") |
||||
|
||||
flag.Parse() |
||||
|
||||
return opts |
||||
} |
||||
|
||||
func numeric_sort(a string, b string) int { |
||||
a_int, a_err := strconv.Atoi(a) |
||||
b_int, b_err := strconv.Atoi(b) |
||||
|
||||
if a_err != nil || b_err != nil { |
||||
return strings.Compare(a, b) |
||||
} else { |
||||
return a_int - b_int |
||||
} |
||||
} |
||||
|
||||
func ignore_case_sort(a string, b string) int { |
||||
return strings.Compare(strings.ToLower(a), strings.ToLower(b)) |
||||
} |
||||
|
||||
func main() { |
||||
lines := make([]string, 0, 100) |
||||
opts := parse_opts() |
||||
|
||||
scan := bufio.NewScanner(os.Stdin) |
||||
|
||||
for scan.Scan() { |
||||
line := scan.Text() |
||||
lines = append(lines, line) |
||||
} |
||||
|
||||
if opts.Numeric { |
||||
slices.SortFunc(lines, numeric_sort) |
||||
} else if opts.IgnoreCase{ |
||||
slices.SortFunc(lines, ignore_case_sort) |
||||
} else { |
||||
slices.Sort(lines) |
||||
} |
||||
|
||||
for _, line := range lines { |
||||
fmt.Println(line) |
||||
} |
||||
} |
||||
@ -0,0 +1,18 @@ |
||||
head |
||||
numfmt |
||||
od |
||||
sha512sum |
||||
sort |
||||
starter |
||||
LICENSE |
||||
outline.txt |
||||
README.md |
||||
stat |
||||
tail |
||||
tr |
||||
uniq |
||||
cat |
||||
date |
||||
du |
||||
wc |
||||
.gitignore |
||||
Loading…
Reference in new issue