删除文本文件中的重复行

时间:2017-12-01 14:54:27

标签: text duplicates line repeat

我一直在搜索,但无法获得执行以下整体任务的自动脚本: 1)浏览文件夹中的所有文本文件

2)从文本文件中删除重复的行/行(文本已经排序,因此可以跳过排序部分)

3)保存&覆盖文本文件

不幸的是,我搜索的所有结果只是从1个特定文件中删除行,并另存为另一个文件名。

然后我将设置一个计划任务来运行这个脚本。

我没有任何脚本知识,只有很少的批处理脚本设置经验。非常感谢您的帮助和指导。

2 个答案:

答案 0 :(得分:0)

  

不幸的是,我搜索的所有结果只是从1个特定文件中删除行,并另存为另一个文件名。

我想你的答案就在这里。我不知道你写的是哪种语言,但通常在这种情况下我会这样做。

  1. 打开文件A
  2. 读取行
  3. 排序
  4. 删除重复的行
  5. 另存为文件B
  6. 关闭文件A
  7. 将文件A重命名为_backup或_original(不必要,但是防止数据丢失的安全防护)
  8. 将文件B重命名为文件A
  9. 我再一次不知道你在写什么语言......这里还没有足够的细节来回答这个问题。

    关键是要删除原始文件,并将新文件重命名为原始文件。

答案 1 :(得分:0)

我在GoLang为你编写并评论了一个小脚本如果你知道如何运行它可能对你有帮助。如果没有,快速研究将对您有所帮助。

package main

import (
    "io/ioutil"
    "strings"
    "log"
    "os"
)

func main() {
    // get all files in directory
    files, err := ioutil.ReadDir(".")
    // check error
    if err != nil { log.Println(err) }
    // go through all the files
    for _, file := range files {
        // check if it's a txt file (can change this)
        if strings.HasSuffix(file.Name(), "txt") { // you can change this
            // read the lines
            line, _ := ioutil.ReadFile(file.Name())
            // turn the byte slice into string format
            strLine := string(line)
            // split the lines by a space, can also change this
            lines := strings.Split(strLine, " ")
            // remove the duplicates from lines slice (from func we created)
            RemoveDuplicates(&lines)
            // get the actual file
            f, err := os.OpenFile(file.Name(), os.O_APPEND|os.O_WRONLY, 0600)
            // err check
            if err != nil { log.Println(err) }
            // delete old one
            os.Remove(file.Name())
            // create it again
            os.Create(file.Name())
            // go through your lines
            for e := range lines {
                // write to the file without the duplicates
                f.Write([]byte(lines[e] +" ")) // added a space here, but you can change this
            }
            // close file
            f.Close()
        }
    }
}

func RemoveDuplicates(lines *[]string) {
    found := make(map[string]bool)
    j := 0
    for i, x := range *lines {
        if !found[x] {
            found[x] = true
            (*lines)[j] = (*lines)[i]
            j++
        }
    }
    *lines = (*lines)[:j]
}

您的档案:hello hello yes no 返回结果:hello yes no

如果您在包含所有文件的目录中运行此程序,它将删除重复项。

希望它符合您的需求。