【问题标题】:How to remove duplicates from a file and write to the same file?如何从文件中删除重复项并写入同一个文件?
【发布时间】:2012-07-07 16:38:00
【问题描述】:

我知道我的标题不言自明,但让我在这里尝试解释一下。

我有一个文件名test.txt,其中有一些重复的行。现在,我要做的是删除那些重复的行,同时将 update test.txt 与新内容一起删除。

test.txt

AAAA
BBBB
AAAA
CCCC

我知道我可以使用 sort -u test.txt 删除重复项,但要使用新内容更新文件,我如何将其输出重定向到同一个文件。下面的命令不起作用。

sort -u test.txt > test.txt

那么,为什么上面的命令不起作用,正确的方法是什么?

还有其他方法吗

sort_and_update_file test.txt

无需重定向即可对我的文件进行排序并自动更新。

【问题讨论】:

标签: bash file sorting duplicates in-place


【解决方案1】:

这可能对你有用:

sort -u -o test.txt test.txt

【讨论】:

  • 感谢您的回答,但为什么我无法将重定向与排序一起使用。
【解决方案2】:

shell 中的重定向不起作用,因为您试图同时从同一个文件读取和写入。实际上,在执行排序之前,该文件已打开写入 (> file.txt)

@potong 的答案有效,因为排序程序本身可能会将所有行存储在内存中,我不会依赖它,因为它没有在手册页中明确指定它可以与输入文件相同(尽管它可能会工作)。除非记录为“就地”工作,否则我不会这样做(@perreal 的答案会起作用,或者您可以将中间结果存储在 shell 内存中)

【讨论】:

  • 任何sort 只能在算法知道要排序的所有 个条目后才能输出任何内容——无论使用何种算法,这都是正确的。这意味着只有在不再需要从 test.txt 读取时才会给出来自 sort 的输出,所以我会说输出到同一个文件是每个定义安全的......
  • @rody_o,你不能设想一种在磁盘上运行的排序吗?在“无限记忆”出现之前他们做了什么?有没有办法在磁盘上排序?我只是不假设知道某些东西是如何实现的,如果它被记录为支持“就地”或明确允许相同的文件,那么我相信它,否则我宁愿在安全方面犯错。
  • 是的,想想看……对大文件进行排序必须在磁盘上完成,我的错。我有一半假设小文件会被读取一次并且算法从内存中执行......所以sort -o必须对test.txt进行超过2N次写入,假设它包含N行,对吗?
  • @rody_o 从复杂性的角度来看 O(N)==O(2N),所以 2N 实际上并没有那么糟糕,但确实意味着你不能使用同一个文件......也就是说,关于排序复杂性的讨论超出了本次讨论的范围(我很生疏,从大学开始就没有这样做过),但我认为它会更糟......
  • @nhed:你说的叫“外部排序”;维基百科有一个good article on it
【解决方案3】:

使用 Sponge 读取/写入同一文件

您可以使用moreutils 中的 sponge 实用程序在写入文件之前吸收标准输出。这可以防止您必须四处打乱文件,并近似于就地编辑。例如:

sort -u test.txt | sponge test.txt

样本输出

使用您的语料库,这会产生预期的输出。

$ cat test.txt 
AAAA
BBBB
CCCC

【讨论】:

    【解决方案4】:

    这并不像看起来那么低效:

    sort -u test.txt > test.txt.tmp && mv test.txt.tmp test.txt 
    

    【讨论】:

    • 这可能还不够,但@potong的答案更简洁。
    • 这是这个问题的规范答案。安全、便携、简单且惯用。
    【解决方案5】:

    您可以使用 vim 就地编辑文件:

    $ ex -s +'%!sort' -cxa test.txt
    

    多个文件:

    $ ex -s +'bufdo!%!sort' -cxa *.*
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多