본문 바로가기
CS/Go

[Go언어연습] 중복 된 내용이 있는 파일명 리스트를 출력하는 프로그램

by Warehaus 2023. 6. 6.
 

사진: UnsplashSergi Kabrera

 

 

안녕하세요

 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.