diff --git a/ch1/1_4.go b/ch1/1_4.go new file mode 100644 index 0000000..c4acd56 --- /dev/null +++ b/ch1/1_4.go @@ -0,0 +1,51 @@ +package main + +import ( + "bufio" + "fmt" + "log" + "os" + "strings" +) + +func main() { + counts := make(map[string][]string) + file := os.Args[1:] + if len(file) == 0 { + countLines(os.Stdin, counts) + } else { + for _, i := range file { + f, err := os.Open(i) + if err != nil { + log.Print(err) + } + countLines(f, counts) + f.Close() + } + } + for lines, n := range counts { + if len(n) > 1 { + fmt.Printf("%v\t\"%s\"\n", n, strings.Trim(lines, " ")) + } + } +} + +func contains(slice []string, file string) bool { + for _, i := range slice { + if i == file { + return true + } + } + return false +} + +func countLines(f *os.File, counts map[string][]string) { + input := bufio.NewScanner(f) + for input.Scan() { + cur := counts[input.Text()] + if !contains(cur, f.Name()) { + cur = append(cur, f.Name()) + counts[input.Text()] = cur + } + } +}