안녕하세요
warehouse입니다.
오늘은 Go 언어를 연습하는 과정에서 만든
프로그램에 대한 코드를 정리해 보았습니다.
아래 코드는 파일 리스트를 인자로 받아
같은 내용을 갖고있는 파일들 리스트를 출력하는 프로그램 입니다.
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
counts := make(map[string]int)
m_filename := make(map[string]int)
files := os.Args[1:]
if len(files) == 0 {
countLines(os.Stdin, counts, m_filename)
} 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, m_filename)
f.Close()
}
}
for line, n := range counts {
if n > 1 {
fmt.Printf("%d\t%s\n", n, line)
}
}
fmt.Printf("Dup files : ")
for filename, n := range m_filename {
if n > 1 {
fmt.Printf("%s ", filename)
}
}
fmt.Println()
}
func countLines(f *os.File, counts map[string]int, m_filename map[string]int) {
input := bufio.NewScanner(f)
for input.Scan() {
counts[input.Text()]++
if counts[input.Text()] > 1 {
m_filename[f.Name()]++
}
}
// Note: Ignore errors from input.Err()
}
프로그램 실행결과는 다음과 같습니다.
> ./practice_1_4 dup1.go practice_1_4.go echo3.go
2 for line, n := range counts {
2 "bufio"
2 counts := make(map[string]int)
7 }
2 fmt.Printf("%d\t%s\n", n, line)
3 package main
3 "fmt"
3 "os"
3 )
2 counts[input.Text()]++
6 }
14
3 if n > 1 {
2 for input.Scan() {
3 func main() {
3 import (
4 }
Dup files : practice_1_4.go echo3.go dup1.go
practice_1_4 이름으로 빌드하여 실행하였고
dup1.go, practice_1_4.go, echo3.go 파일을 읽어
중복 된 내용을 카운트합니다.
그리고 왼쪽에는 중복 카운트를, 오른쪽에는 중복내용을 출력한 뒤
맨 마지막에는 중복이 된 코드라인이 있는 모든 파일리스트를 출력하는 프로그램 입니다.
인자로 입력 한 모든 파일이름이 출력되어서
결과가 잘 나오는지 알 수 없으니
테스트로 중복되는 라인이 없는 파일을 하나 만들어 보겠습니다.
$ cat nodups
@@THERE IS NO DUPS@@
nodups 라는 파일을 만들었고
이 파일까지 인자로 입력해서
출력을 확인해 보겠습니다.
$ ./practice_1_4 dup1.go practice_1_4.go echo3.go nodups
3 if n > 1 {
3 )
7 }
2 fmt.Printf("%d\t%s\n", n, line)
2 "bufio"
3 "fmt"
14
3 import (
3 func main() {
2 for input.Scan() {
3 "os"
2 for line, n := range counts {
4 }
6 }
2 counts[input.Text()]++
3 package main
2 counts := make(map[string]int)
Dup files : dup1.go practice_1_4.go echo3.go
nodups 파일을 인자에 추가했음에도
이전과 동일한 결과가 나오는 것을 확인할 수 있습니다.
즉, nodups 파일의 내용과 중복되는 파일이 없음을 의미합니다.
warehose.
'CS > Go' 카테고리의 다른 글
go programming - byte array 숫자에 콤마를 붙이는 방법 (0) | 2023.07.23 |
---|---|
[Go programming] Requesting http get method to an url from an argument (0) | 2023.06.24 |
[Go언어] 중복 줄 찾기 프로그램, 입/출력에 활용하는 bufio 패키지 (0) | 2023.05.18 |
[Go언어기초] go 언어 반복문, for 문 사용하기 (0) | 2023.05.07 |
[프로그래밍 언어] Go 언어 기초 - 커맨드라인 인수와 os.Args 변수 (0) | 2023.05.01 |