diff --git a/ch1/dup2.go b/ch1/dup2.go new file mode 100644 index 0000000..4a8548f --- /dev/null +++ b/ch1/dup2.go @@ -0,0 +1,40 @@ +// Dup2 выводит текст каждой строки, которая появляется +// во входных данных более одного раза. Программа читает +// стандарный вывод или список именованных файлов. +package main + +import ( + "bufio" + "fmt" + "os" +) + +func main() { + counts := make(map[string]int) + files := os.Args[1:] + if len(files) == 0 { + countLines(os.Stdin, counts) + } else { + for _, arg := range files { + f, err := os.Open(arg) + if err != nil { + fmt.Fprintf(os.Stderr, "dup2: %v\n", err) + continue + } + countLines(f, counts) + f.Close() + } + } + for line, n := range counts { + if n > 1 { + fmt.Printf("%d\t%s\n", n, line) + } + } +} + +func countLines(f *os.File, counts map[string]int) { + input := bufio.NewScanner(f) + for input.Scan() { + counts[input.Text()]++ + } +} \ No newline at end of file